如何实施集成测试以检查我的断路器后备是否被调用?

时间:2017-11-28 13:42:54

标签: testing spring-boot spring-cloud-netflix hystrix spring-cloud-feign

在我的应用程序中,我需要调用外部端点,如果速度太慢,则会激活回退。

以下代码是我的应用程序的示例:

@FeignClient(name = "${config.name}", url = "${config.url:}", fallback = ExampleFallback.class)
public interface Example {
@RequestMapping(method = RequestMethod.GET, value = "/endpoint", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
    MyReturnObject find(@RequestParam("myParam") String myParam);
}

其后备实施:

@Component
public Class ExampleFallback implements Example {

    private final FallbackService fallback;

    @Autowired
    public ExampleFallback(final FallbackService fallback) {
        this.fallback = fallback;
    }

    @Override
    public MyReturnObject find(final String myParam) {
        return fallback.find(myParam);
    }

此外,配置的断路器超时: hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 5000

如何实现集成测试以检查我的断路是否正常,即,如果我的端点(在这种情况下是模拟的)很慢或者它是否返回了像4xx或5xx这样的错误?

我正在使用Spring Boot 1.5.3和Spring Cloud(Feign + Hystrix)

1 个答案:

答案 0 :(得分:1)

注意我不知道Feign或Hystrix。

在我看来,实现一个模拟Feign + Hystrix的不同实现结果的自动化集成测试是有问题的 - 这个实现细节可以随时改变。有许多不同类型的故障:primary-Endpoint无法访问,非法数据(即接收html-errormessage,以特殊格式表示xml数据),disk-full,.....

如果你模拟一个端点,你假设了一个Feign + Hystrix的实现,如果端点在一个错误的情况下表现如何(即返回null,返回一些特定的错误代码,抛出Xyz类型的异常......)

我只会创建一个自动集成测试,其中包含一个真正的主要节点,该节点具有永不可访问的URL和模拟后备端点,您可以在其中验证处理后的数据是否来自模拟。 这种自动化测试假设处理"网络连接太慢"与" url-notfound"相同从你的应用程序的角度来看。

对于所有其他测试,我会围绕Feign + Hystrix创建一个薄的包装器界面,您可以在其中模拟Feign + Hystrix。通过这种方式,您可以自动测试,例如,如果从主接口接收200字节然后获得预算,会发生什么。

有关隐藏外部依赖项的详细信息,请参阅onion-architecture