#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 раз.
Вы забываете первый исключительный случай, который является нормальным поведением при запуске