【问题标题】:How to write a unit test for a method that does a retry with back off? (Using FailSafe in Java)如何为进行后退重试的方法编写单元测试? (在 Java 中使用 FailSafe)
【发布时间】:2017-05-24 08:50:07
【问题描述】:

这是我想测试的方法:

void someMethodThatRetries(){
Failsafe.with( retryPolicy ).get(() -> callServiceX());
}

重试策略如下所示:

this.retryPolicy = new RetryPolicy()
                .retryIf( responseFromServiceXIsInvalid() )
                .withBackoff( delay, MAX_DELAY, TimeUnit.MILLISECONDS )

此方法调用服务 X 并在特定条件下重试对服务 X 的调用(来自 X 的响应没有特定值)。每次重试都有延迟和退避。 测试看起来像这样:

@Test
    public void retriesAtMostThreeTimesIfResponseIsInvalid() throws Exception {

// Code that verifies that ServiceX got called 3 times. Service is called using a stub, and I am verifying on that stub 

}

我正在编写一个测试来验证服务 X 在满足条件时被调用 3 次(最大允许重试次数为 3 次)。

由于延迟和退避,单元测试需要太多时间。在这种情况下我们应该如何编写测试?

我想到的一个解决方案是对 RetryPolicy 做一个单独的测试,它应该重试 3 次,并单独测试它在满足条件时重试的事实。

我该怎么做?

【问题讨论】:

    标签: java unit-testing java-failsafe


    【解决方案1】:

    我想说您应该针对函数callServiceXresponseFromServiceXIsInvalid 进行单元测试,但除此之外,您还处于集成测试和子系统测试(也称为组件测试)的领域。这里所有具有算法性质的东西都隐藏在 FailSafeRetryPolicy 类和方法后面——您的代码只是在调用它们。

    因此,您的代码可能包含的许多错误在于与这些外部类的交互/正确使用。例如,您可能弄乱了参数 delayMAX_DELAY 的顺序 - 您只会在集成测试中发现这一点。

    单元测试级别也存在潜在的错误,例如,delay 的值可能与指定的时间单位不匹配。在我看来,在这种情况下通过单元测试检查这一点的麻烦太大了。在重新查看中检查这一点,或者再次使用子系统测试来查看持续时间是否符合您的预期。

    一些额外的警告:在进行集成测试和子系统测试时,请务必将注意力集中在您想要查找的错误上。这将帮助您避免最终您正在有效地测试 FailSafe 和 RetryPolicy 类 - 希望它们已经被库开发人员测试过。

    【讨论】:

      猜你喜欢
      • 2020-12-02
      • 1970-01-01
      • 2022-08-11
      • 1970-01-01
      • 1970-01-01
      • 2020-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多