在我的应用程序中,我需要调用一个外部端点,如果速度太慢,则会激活回退。
以下代码是我的应用程序的示例:
@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) 结合使用
最佳答案
请注意,我不知道 Feign 或 Hystrix。
在我看来,实现一个模拟 Feign+Hystrix 不同实现细节的自动化集成测试是有问题的——这个实现细节可以随时改变。有许多不同类型的故障:无法访问主端点、非法数据(即接收到 html 错误消息,当以特殊格式导出 xml 数据时)、磁盘已满、......
如果你模拟一个端点,你假设 Feign+Hystrix 的实现细节端点在错误情况下的行为(即返回 null,返回一些特定的错误代码,抛出 Xyz 类型的异常......)
我将只创建一个自动集成测试,其中包含一个真正的主端点,该端点具有永远无法访问的 url 和一个模拟后备端点,您可以在其中验证处理的数据是否来自模拟。 此自动化测试假设从您的应用程序的角度来看,“网络连接太慢”的处理与“url-notfound”的处理相同。
对于所有其他测试,我会围绕 Feign+Hystrix 创建一个薄包装接口(interface),您可以在其中模拟 Feign+Hystrix。通过这种方式,您可以自动测试,例如,如果您从主接口(interface)接收到 200 字节然后获得一个实验,会发生什么情况。
有关隐藏外部依赖项的详细信息,请参阅 onion-architecture
关于testing - 如何实现集成测试以检查我的断路器回退是否被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47533079/