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

Spring重试总是比测试中要求的重试多一次

卓俊晖
2023-03-14

我是Spring的新手,尝试用一个简单的测试实现Spring重试。但是我不能让它工作,希望有人能告诉我我做错了什么。我还想知道,是否可以编写单元测试来验证Spring重试已经尝试了请求的最大重试次数?因为到目前为止,谷歌搜索似乎只能在集成测试中工作,因为它需要Spring首先设置上下文。

@SpringBootApplication
public class SpringtestApplication {

  public static void main(String[] args) {
    new SpringApplicationBuilder(SpringtestApplication.class).run(args);
  }

}
@Configuration
@EnableRetry
public class FakeConfiguration implements ApplicationRunner {

  private final FakeParser fakeParser;

  public FakeConfiguration(FakeParser fakeParser) {
    this.fakeParser = fakeParser;
  }

  @Override
  public void run(ApplicationArguments args) {
    this.runParser();
  }

  @Retryable(maxAttempts = 5, value = RuntimeException.class)
  public void runParser() {
    fakeParser.add();
  }
}
@Component
public class FakeParser {

  public int add(){
    int result = 113;
    return result;
  }
}
@RunWith(SpringRunner.class)
@SpringBootTest
class SpringtestApplicationTests {

  @Autowired
  private FakeConfiguration fakeConfiguration;

  @MockBean
  private FakeParser fakeParser;

  @Test
  public void retry5times(){
    when(fakeParser.add()).thenThrow(RuntimeException.class);

    try {
      fakeConfiguration.runParser();
    } catch (RuntimeException e){
    }

    verify(fakeParser, times(5)).add();
  }
}
org.mockito.exceptions.verification.TooManyActualInvocations: 
fakeParser bean.add();
Wanted 5 times:
-> at com.example.springtest.SpringtestApplicationTests.retry5times(SpringtestApplicationTests.java:43)
But was 6 times:
-> at com.example.springtest.FakeConfiguration.runParser(FakeConfiguration.java:26)
-> at com.example.springtest.FakeConfiguration.runParser(FakeConfiguration.java:26)
-> at com.example.springtest.FakeConfiguration.runParser(FakeConfiguration.java:26)
-> at com.example.springtest.FakeConfiguration.runParser(FakeConfiguration.java:26)
-> at com.example.springtest.FakeConfiguration.runParser(FakeConfiguration.java:26)
-> at com.example.springtest.FakeConfiguration.runParser(FakeConfiguration.java:26)

共有1个答案

岳承悦
2023-03-14

你很可能尝试用

Mockito.verify(fakeParser,times(5)).add(Mockito.any());

你应该考虑第一次运行,因为当你重试5次并再次运行。即使重试5次,也应该运行6次。

你忘记了第一个例外情况,这是正常的运行行为

 类似资料:
  • 本文向大家介绍Spring Cloud重试机制与各组件的重试总结,包括了Spring Cloud重试机制与各组件的重试总结的使用技巧和注意事项,需要的朋友参考一下 SpringCloud重试机制配置 首先声明一点,这里的重试并不是报错以后的重试,而是负载均衡客户端发现远程请求实例不可到达后,去重试其他实例。 feign重试机制 feign默认是通过自己包下的Retryer进行重试配置,默认是5次

  • 本文向大家介绍请你回答一下单元测试、集成测试、系统测试、验收测试、回归测试这几步中最重要的是哪一步相关面试题,主要包含被问及请你回答一下单元测试、集成测试、系统测试、验收测试、回归测试这几步中最重要的是哪一步时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 这些测试步骤分别在软件开发的不同阶段对软件进行测试,我认为对软件完整功能进行测试的系统测试很重要,因为此时单元测试和集成测试已完成,能够

  • 我试图测试使用自定义重试策略的重试模板。为了做到这一点,我使用以下示例: https://github.com/spring-projects/spring-retry/blob/master/src/test/java/org/springframework/retry/support/retrytemplatetests.java#l57 基本上,我的目标是在得到一些特定的http错误状态(例

  • 问题内容: 我想在我的应用程序中使用请求范围的bean。我使用JUnit4进行测试。如果我尝试在这样的测试中创建一个: 使用以下bean定义: 我得到: 但是我注意到他使用了AbstractDependencyInjectionSpringContextTests,它似乎在Spring 3.0中已被弃用。我目前使用Spring 2.5,但认为切换此方法以使用Docs建议的使用AbstractJUn

  • 我最终做的是在测试设置过程中替换应用程序级图(MockRestAdapter就是在其中创建的

  • JUnit Jupiter通过使用@RepeatedTest注解方法并指定所需的重复次数,提供了重复测试指定次数的功能。每次重复测试的调用都像执行常规的@Test方法一样,完全支持相同的生命周期回调和扩展。 以下示例演示了如何声明名为repeatedTest()的测试,该测试将自动重复10次。 @RepeatedTest(10) void repeatedTest() { // ... }