Как бороться с исключением UnnecessaryStuddingException в Mockito при использовании @ParameterizedTestJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как бороться с исключением UnnecessaryStuddingException в Mockito при использовании @ParameterizedTest

Сообщение Anonymous »

Я переношу некоторые тесты в более новые версии Mockito и натыкаюсь на стену, когда дело доходит до тестов @ParameterizedTest и исключения UnnecessaryStubbingsException в Mockito.
Проблема в том, что рассматриваемый тест иногда требует имитирования службы, в зависимости от параметров теста. Для некоторых параметров код не будет выполняться до строки, в которой вызывается имитируемая служба, а для других параметров — будет.
Это приводит к тому, что 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")
);
}
Пример немного надуманный, но он завершится ошибкой из-за исключения UnnecessaryStubblingsException, поскольку первый параметр, с которым выполняется тест, не требует макета. Если я удалю заглушку, тест с первым параметром будет работать, но завершится ошибкой при втором запуске со следующим параметром.
Есть ли способ обойти это? Я знаю, что один из вариантов решения этой проблемы — использовать Mockito.lenient(). Другой вариант — провести рефакторинг и переместить параметры, для которых требуется макет, в отдельный тест.
Мне интересно, есть ли какой-нибудь другой/лучший подход или что-то еще, чего мне не хватает. здесь.

Подробнее здесь: https://stackoverflow.com/questions/742 ... rameterize
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»