【问题标题】:Spring Retry always retry one time more than asked in testSpring Retry 总是比测试中的要求多重试一次
【发布时间】:2021-12-06 09:56:02
【问题描述】:

我是 Spring 新手,正在尝试通过一个简单的测试来实现 Spring Retry。 但是我不能让它工作,希望有人能告诉我我做错了什么。 另外我想知道,是否可以编写单元测试来验证 Spring Retry 是否已尝试请求的最大重试次数?因为从谷歌搜索来看,它似乎只能在集成测试中工作,因为它需要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)

【问题讨论】:

  • 请贴出整个测试方法。我没有看到失败的断言
  • 对不起,我发布了错误的测试。现在已经更正了
  • 看看Spock。我不会使用其他任何东西,尤其是用于 Spring Boot,它本机支持。

标签: java spring-boot testing


【解决方案1】:

when(someObject.someMethod()) 评估该方法并对其进行真正的调用。这就是为什么你总是得到比想要的多一个调用。

如果您需要计算实际调用次数,您可以将1 添加到您的verify,但这是一个不推荐(也不需要)的丑陋解决方法。或者您可以使用没有该问题的Mockito.doXXX 方法。

你可以试试

doThrow(new RuntimeException()).when(fakeParser).add();

这应该最终为您提供正确的调用数量。注意when 用法的区别:when(fakeParser).add()(两个方法链接在一起)vs when(fakeParser.add())(只有一个方法)

【讨论】:

    【解决方案2】:

    你很可能会尝试

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

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

    您忘记了第一个异常情况,这是正常的运行行为

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-16
      • 2019-03-27
      • 1970-01-01
      • 1970-01-01
      • 2020-07-23
      • 2018-09-01
      • 1970-01-01
      • 2018-10-11
      相关资源
      最近更新 更多