4

我使用鸦胆子和注释我栲命令的方法是这样的:如何对javanica @HystrixCommand注释方法进行单元测试?

@HystrixCommand(groupKey="MY_GROUP", commandKey="MY_COMMAND" fallbackMethod="fallbackMethod") 
public Object getSomething(Object request) { 
.... 

而且我想单元测试我的备用方法,而不必直接打电话给他们,也就是我想打电话给@HystrixCommand注解的方法并在抛出500错误后让它自然流入回退。这一切都在单元测试之外运作。

在我的单元测试中,我使用弹簧MockRestServiceServer返回500个错误,这部分工作正常,但Hystrix未在我的单元测试中正确初始化。在我的测试方法的开始,我有:

HystrixRequestContext context = HystrixRequestContext.initializeContext(); 
myService.myHystrixCommandAnnotatedMethod(); 

在此之后,我试图键搞定任何锥命令并检查是否有任何执行的命令,但该列表始终是空的,我用这个方法:

public static HystrixInvokableInfo<?> getHystrixCommandByKey(String key) { 
    HystrixInvokableInfo<?> hystrixCommand = null; 
    System.out.println("Current request is " + HystrixRequestLog.getCurrentRequest()); 
    Collection<HystrixInvokableInfo<?>> executedCommands = HystrixRequestLog.getCurrentRequest() 
      .getAllExecutedCommands(); 
    for (HystrixInvokableInfo<?> command : executedCommands) { 
     System.out.println("executed command is " + command.getCommandGroup().name()); 
     if (command.getCommandKey().name().equals(key)) { 
      hystrixCommand = command; 
      break; 
     } 
    } 
    return hystrixCommand; 
} 

我意识到我失去了一些东西在我的单元测试的初始化,任何人都可以点我在正确的方向上怎么可以适当单元测试呢?

+0

嗨@Oscar你找到了解决方案吗? –

+1

@StefanoL nope,找不到任何解决方案。我仍然希望有人有办法做到这一点。 –

+1

我想过编写名为XYZHystrixTest的单独测试类,它实际上是用Hystrix在原地启动Spring Context的。我没有看到任何其他解决方案来解决这个问题。 –

回答

2

虽然你不一定UNIT测试hystrix命令。有一种春季混合测试仍然很有用,我认为在添加注释时点空白接受功能是不正确的。我创建的测试确保断路器在异常情况下打开。

@RunWith(SpringRunner.class) 
@SpringBootTest 
public class HystrixProxyServiceTests { 

    @MockBean 
    private MyRepo myRepo; 

    @Autowired 
    private MyService myService; 

    private static final String ID = “1”; 

    @Before 
    public void setup() { 
     resetHystrix(); 
     openCircuitBreakerAfterOneFailingRequest(); 
    } 

    @Test 
    public void circuitBreakerClosedOnSuccess() throws IOException, InterruptedException { 

     when(myRepo.findOneById(USER_ID1)) 
     .thenReturn(Optional.of(Document.builder().build())); 

     myService.findOneById(USER_ID1); 
     HystrixCircuitBreaker circuitBreaker = getCircuitBreaker(); 
     Assert.assertTrue(circuitBreaker.allowRequest()); 

     verify(myRepo, times(1)).findOneById(
      any(String.class)); 
    } 

    @Test 
    public void circuitBreakerOpenOnException() throws IOException, InterruptedException { 

     when(myRepo.findOneById(ID)) 
      .thenThrow(new RuntimeException()); 

     try { 
      myService.findOneById(ID); 
     } catch (RuntimeException exception) { 
      waitUntilCircuitBreakerOpens(); 
      HystrixCircuitBreaker circuitBreaker = getCircuitBreaker(); 
      Assert.assertFalse(circuitBreaker.allowRequest()); 
     } 

     verify(myRepo, times(1)).findOneById(
      any(String.class)); 
    } 

    private void waitUntilCircuitBreakerOpens() throws InterruptedException { 
     Thread.sleep(1000); 
    } 

    private void resetHystrix() { 
     Hystrix.reset(); 
    } 

    private void warmUpCircuitBreaker() { 
     myService.findOneById(USER_ID1); 
    } 

    public static HystrixCircuitBreaker getCircuitBreaker() { 
     return HystrixCircuitBreaker.Factory.getInstance(getCommandKey()); 
    } 

    private static HystrixCommandKey getCommandKey() { 
     return HystrixCommandKey.Factory.asKey("findOneById"); 
    } 

    private void openCircuitBreakerAfterOneFailingRequest() { 

     ConfigurationManager.getConfigInstance(). 
      setProperty("hystrix.command.findOneById.circuitBreaker.requestVolumeThreshold", 1); 
    } 

} 

绊了我一会儿另一个小的事情是,我已经进入了默认的注解没有一个具体的命令键,但是当创建命令键它们对方法的名称创建这就是我已经在上面指定。对于完整的示例,我还添加了注释以显示我没有指定commandKey。

@HystrixCommand 
public Optional<Document> findOneById(final String id) { 
    return this.myRepo.findOneById(id); 
} 

希望这可以帮助别人。

1

Hystrix是一个您接受的功能, 很像Spring是一个您接受的功能。 您不需要单元测试Hystrix调用回退方法的能力。

您应该通过在单元测试中直接调用fallback方法来单元测试。

也就是说, 当您希望Hystrix调用回退方法时,您可能需要测试Hystrix实际调用回退方法; 这不会是一个单元测试, 这将是一个集成测试。

尽管可以使用jUnit编写许多集成测试,但看起来Hystrix并不想参与jUnit测试。

我建议您应该将应用程序安装在开发和/或qa测试环境中,并通过在正在运行的系统上强制回退来测试Hystrix回退功能。

相关问题