当前位置: 首页 > 知识库问答 >
问题:

如何实施集成测试以检查是否调用断路器回退?

齐承泽
2023-03-14

在我的应用程序中,我需要调用一个外部endpoint,如果它太慢,就会激活回退。

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

@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.timeoutInMillis秒: 5000

我如何实施集成测试来检查我的断路器是否工作,例如,我的endpoint(在这种情况下被模拟)是否很慢,或者它是否返回4xx或5xx等错误?

我正在使用SpringBoot1.5.3和SpringCloud(佯装Hystrix)

共有1个答案

孙钱青
2023-03-14

注意,我不认识菲恩或海斯崔克斯。

在我看来,实现一个自动化集成测试是有问题的,它模拟了FaignHystrix的不同实现细节——这个实现细节可以随时改变。有许多不同类型的故障:主endpoint不可达、非法数据(即在以特殊格式释放xml数据时接收HTML错误消息)、磁盘已满、......

如果您模拟一个endpoint,您可以假设实现的细节,即在错误情况下endpoint的行为(即返回null,返回一些特定的错误代码,抛出Xyz类型的异常......)

我将只创建一个自动集成测试,其中包含一个真正的主enpoint,该enpoint具有一个永远无法访问的url和一个模拟的回退endpoint,您可以在该endpoint中验证处理的数据是否来自模拟。此自动测试假设从应用程序的角度来看,“网络连接太慢”的处理与“url未找到”相同。

对于所有其他测试,我将在模拟假Hystrix的地方围绕假Hystrix创建一个瘦包装器接口。通过这种方式,您可以自动测试,例如,如果您从主接口接收到200字节的数据,然后得到一个expetion,会发生什么情况。

有关隐藏外部依赖项的详细信息,请参见洋葱架构

 类似资料:
  • 问题内容: 有没有一种方法可以确定是否执行了Ajax回发,类似于我们的使用方式… …以确定是否正在执行按钮提交的回发。 我正在尝试检测来自jQuery的Ajax请求,但它也接收了我想排除的UpdatePanel请求,例如… 问题答案: 我不知道这是否会比您的解决方案更好,但是您是否尝试过?

  • 问题内容: 我有一个Python 2.7方法,有时会调用 当满足正确的条件时,是否可以进行单元测试以验证是否调用了此代码行? 问题答案: 是。加注,因此您可以使用以下命令进行检查: 的实例具有设置为建议的退出状态的属性,并且返回的上下文管理器将捕获的异常实例设置为,因此检查退出状态很容易: sys.exit文档: 从Python退出。这是通过引发异常来实现的…可以在外部级别拦截出口尝试。

  • 问题内容: 我有一个Java课。如何检查该类是否包含JUnit4测试的方法?我是否必须使用反射对所有方法进行迭代,还是JUnit4提供这种检查? 编辑: 由于注释不能包含代码,因此我根据以下答案放置了代码: 问题答案: 使用内置的JUnit 4类 org.junit.runners.model.FrameworkMethod 来检查方法。

  • 问题内容: 好吧,我是SQL的新手,我刚刚读到,存储过程始终返回一个值,确定该过程中的查询是否已成功执行是一种很好的做法。 所以我有一个带有select语句的简单存储过程,如果要执行,我想返回1,否则返回-1。 您能告诉我如何用SQL编写该条件吗? 如果有关系,我的数据库是MS SQL Server。 谢谢你。 问题答案: 使用输出参数返回成功状态以及Try..Catch块

  • 问题内容: 有什么方法可以检查Go程序是否在运行时启用了编译功能(例如,用于日志记录/信息目的)? 我检查了文档以及明显的位置(),但找不到任何东西。 问题答案: 据我所知,没有对此的简单检查,但是启用了 build标签后,您就可以利用它了。 我创建了一个新目录,并在其中放置了两个文件: : : 由于使用了build标签,将仅编译两个文件之一。 这也是围棋标准库是怎么做的(,),但由于这是一个内部

  • 我在Apex中有一个触发器。如何编写检查触发器是否被调用的单元测试?