Проблема в том, что рассматриваемый тест иногда требует имитирования службы, в зависимости от параметров теста. Для некоторых параметров код не будет выполняться до строки, в которой вызывается имитируемая служба, а для других параметров — будет.
Это приводит к тому, что Mockito выдает исключение UnnecessaryStubblingsException для случаи, когда макет не используется. Я не могу удалить заглушку, потому что тогда тест завершится неудачно для параметров, где код фактически выполняется до момента, когда сервис нужно будет имитировать.
Для иллюстрации предположим, что у меня есть это фиктивный метод, который я тестирую:
Код: Выделить всё
public boolean process(String flag) {
if (Objects.equals(flag, "flag1")) {
throw new IllegalArgumentException("Oh no, exception!");
}
boolean result = someService.execute(flag);
if (result) {
throw new IllegalArgumentException("Oh no, exception!");
}
return result;
}
Код: Выделить всё
@ParameterizedTest
@MethodSource("getFlags")
void shouldTestIfFlagWorks(String someFlag) {
// Given
Mockito.doReturn(true).when(someService).execute(someFlag);
// When
Throwable thrown = Assertions.catchThrowable(() -> serviceUnderTest.process(someFlag));
// Then
Assertions.assertThat(thrown).hasMessage("Oh no, exception!");
}
private static Stream getFlags() {
return Stream.of(
Arguments.of("flag1"),
Arguments.of("flag2")
);
}
Есть ли способ обойти это? Я знаю, что один из вариантов решения этой проблемы — использовать Mockito.lenient(). Другой вариант — провести рефакторинг и переместить параметры, для которых требуется макет, в отдельный тест.
Мне интересно, есть ли какой-нибудь другой/лучший подход или что-то еще, чего мне не хватает. здесь.
Подробнее здесь: https://stackoverflow.com/questions/742 ... rameterize
Мобильная версия