Повторная попытка Spring всегда повторяет один раз больше, чем задано в тесте

#java #spring-boot #testing

#java #весенняя загрузка #тестирование

Вопрос:

Я новичок в Spring и пытаюсь реализовать Spring Retry с помощью простого теста. однако я не могу заставить это работать, надеюсь, кто-нибудь может показать мне, где я ошибся. Также мне интересно, можно ли написать модульный тест, чтобы убедиться, что повторная попытка Spring выполнила запрошенное максимальное количество попыток? поскольку пока что из-за поиска в Google кажется, что он может работать только в интеграционном тестировании, потому что сначала 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 resu<
  }
}
 

повторный тест для него:

 @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. Пожалуйста, опубликуйте весь метод тестирования. Я не вижу утверждения, которое не выполняется

2. извините, что я опубликовал неправильный тест. теперь это исправлено

3. Взгляните на Спока . Я бы не стал использовать что-либо еще, особенно для spring boot, который он поддерживает изначально.

Ответ №1:

when(someObject.someMethod()) оценивает метод и выполняет его реальный вызов. Вот почему вы всегда получаете на один вызов больше, чем требуется.

Если вам нужно подсчитать фактические вызовы, которые вы можете либо добавить 1 к своим verify , но это уродливый обходной путь, который не рекомендуется (а также не нужен). Или вы можете использовать Mockito.doXXX методы, у которых нет этой проблемы.

В вашем случае вы могли бы попробовать

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

В конце это должно дать вам правильное количество вызовов. Обратите внимание на разницу в использовании when here: when(fakeParser).add() (два метода, соединенных вместе) против when(fakeParser.add()) (только один метод)

Комментарии:

1. Спасибо за ответ, хотя позже я обнаружил, что проблема была вызвана проблемой в другой части кода, все равно ценю ваши усилия, помогающие мне понять проблему.

Ответ №2:

Скорее всего, вы пытаетесь с

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

Вы должны подумать о первом запуске, потому что, когда вы повторяете попытку 5 раз и запускаете еще раз. Это должно быть 6 запусков, даже если вы повторяете попытку 5 раз.

Вы забываете первый исключительный случай, который является нормальным поведением при запуске