Мой код, как показано ниже,
@RunWith(MockitoJUnitRunner.class)
public class MyClass {
private static final String code ="Test";
@Mock
private MyClassDAO dao;
@InjectMocks
private MyClassService Service = new MyClassServiceImpl();
@Test
public void testDoSearch() throws Exception {
final String METHOD_NAME = logger.getName().concat(".testDoSearchEcRcfInspections()");
CriteriaDTO dto = new CriteriaDTO();
dto.setCode(code);
inspectionService.searchEcRcfInspections(dto);
List<SearchCriteriaDTO> summaryList = new ArrayList<SearchCriteriaDTO>();
inspectionsSummaryList.add(dto);
when(dao.doSearch(dto)).thenReturn(inspectionsSummaryList);//got error in this line
verify(dao).doSearchInspections(dto);
}
}
Я получаю исключение ниже
org.mockito.exceptions.misusing.UnnecessaryStubbingException: Unnecessary stubbings detected in test class: Test Clean & maintainable test code requires zero unnecessary code. Following stubbings are unnecessary (click to navigate to relevant line of code): 1. -> at service.Test.testDoSearch(Test.java:72) Please remove unnecessary stubbings or use 'silent' option. More info: javadoc for UnnecessaryStubbingException class. at org.mockito.internal.exceptions.Reporter.formatUnncessaryStubbingException(Reporter.java:838) at org.mockito.internal.junit.UnnecessaryStubbingsReporter.validateUnusedStubs(UnnecessaryStubbingsReporter.java:34) at org.mockito.internal.runners.StrictRunner.run(StrictRunner.java:49) at org.mockito.junit.MockitoJUnitRunner.run(MockitoJUnitRunner.java:103) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Пожалуйста, помогите мне как решить
@RunWith(MockitoJUnitRunner.Silent.class)
@RunWith(MockitoJUnitRunner.Silent::class)
Сначала вы должны проверить свою тестовую логику. Обычно бывает 3 случая. Во-первых, вы высмеиваете неправильный метод (вы допустили опечатку или кто-то изменил проверенный код, так что имитируемый метод больше не используется). Во-вторых, ваш тест завершился ошибкой до вызова этого метода. В-третьих, ваша логика ошибается, если ветвь if / switch где-то в коде, так что фиктивный метод не вызывается.
Если это первый случай, вы всегда хотите изменить фиктивный метод на тот, который используется в коде. Со вторым и третьим зависит. Обычно вы должны просто удалить этот макет, если он не нужен. Но иногда в параметризованных тестах есть определенные случаи, когда они должны идти по другому пути или терпеть неудачу раньше. Затем вы можете разделить этот тест на два или несколько отдельных, но это не всегда хорошо выглядит. 3 метода тестирования с возможно 3 поставщиками аргументов могут сделать ваш тест нечитаемым. В этом случае для JUnit 4 вы замалчиваете это исключение либо
аннотации или если вы используете подход правил
или (такое же поведение)
Для тестов JUnit 5 вы можете отключить это исключение, используя аннотацию, предоставленную в
mockito-junit-jupiter
package.источник
Mockito.lenient().when(...)
: для этого конкретного вопроса это будетMockito.lenient().when(dao.doSearch(dto)).thenReturn(inspectionsSummaryList);
Молчать - это не решение. Вам нужно исправить свой макет в своем тесте. См. Официальную документацию здесь .
Ненужные заглушки - это заглушенные вызовы методов, которые никогда не были реализованы во время выполнения теста (см. Также MockitoHint), например:
Обратите внимание, что один из заглушенных методов никогда не был реализован в тестируемом коде во время выполнения теста. Блуждающая заглушка может быть недосмотром разработчика, артефактом копирования-вставки или эффектом непонимания теста / кода. В любом случае разработчик получает ненужный тестовый код. Чтобы кодовая база оставалась чистой и поддерживаемой, необходимо удалить ненужный код. В противном случае тесты труднее читать и рассуждать.
Чтобы узнать больше об обнаружении неиспользуемых заглушек, см. MockitoHint.
источник
Для меня ни предложения,
@Rule
ни@RunWith(MockitoJUnitRunner.Silent.class)
предложения не сработали. Это был устаревший проект, в котором мы обновились до mockito-core 2.23.0.Мы могли бы избавиться от этого
UnnecessaryStubbingException
, используя:вместо того:
Излишне говорить, что вам лучше смотреть на тестовый код, но нам нужно было скомпилировать материал и запустить тесты в первую очередь;)
источник
when
Здесь настраивает свой макет , чтобы сделать что - то. Однако вы больше не используете этот макет после этой строки (кроме выполнения averify
). Mockito предупреждает вас, чтоwhen
строчка бессмысленна. Возможно, вы допустили логическую ошибку?источник
Service
), чтобы проверить, правильно ли она отреагирует. Вы вообще этого не делали, так что вы здесь тестируете?Глядя на часть трассировки стека, похоже, что вы заглушаете
dao.doSearch()
где- то еще. Больше похоже на многократное создание заглушек одного и того же метода.Рассмотрим, например, следующий тестовый класс:
Я бы предпочел рассмотреть возможность рефакторинга ваших тестов, чтобы при необходимости заглушить их.
источник
Если вместо этого вы используете этот стиль:
замените его на:
источник
У меня было,
UnnecessaryStubbingException
когда я пытался использоватьwhen
методы на шпионском объекте.Mockito.lenient()
отключил исключение, но результаты теста были неверными.В случае объектов-шпионов необходимо вызывать методы напрямую.
источник
Что ж, в моем случае ошибка Mockito говорила мне вызвать фактический метод после заглушки
when
илиwhenever
. Поскольку мы не вызывали условия, которые только что высмеивали, Mockito сообщал об этом как о ненужных заглушках или коде.Вот как это было, когда появлялась ошибка:
затем я просто вызвал реальный метод, упомянутый в инструкции when, чтобы имитировать метод.
изменения сделаны, как показано ниже
stockViewModelTest.getStockAvailability(listOf(), getStocksApiCallBack)
теперь работает.
источник
Заменить
@RunWith(MockitoJUnitRunner.class)
с участием
@RunWith(MockitoJUnitRunner.Silent.class)
или удалить
@RunWith(MockitoJUnitRunner.class)
или просто закомментируйте нежелательные ложные вызовы (показанные как несанкционированные заглушки).
источник
В случае большого проекта сложно исправить каждое из этих исключений. При этом использование
Silent
не рекомендуется. Я написал сценарий для удаления всех ненужных заглушек, учитывая их список.https://gist.github.com/cueo/da1ca49e92679ac49f808c7ef594e75b
Нам просто нужно скопировать и вставить
mvn
вывод и написать список этих исключений с помощью регулярного выражения, а все остальное позаботится сценарию.источник
Если вы используете any () при насмешке, вам нужно заменить @RunWith (MockitoJUnitRunner.class) на @RunWith (MockitoJUnitRunner.Silent.class).
источник
any()
отлично работает с обычным раннером при правильном использовании.Когда вы создаете макет и этот макет не используется, он выдает исключение неиспользуемой заглушки. В вашем случае этот макет на самом деле не называется. Следовательно, это вызывает эту ошибку. Следовательно, relpace,
@RunWith(MockitoJUnitRunner.class)
с помощью@RunWith(MockitoJUnitRunner.Silent.class)
которого можно удалить ошибку. Если вы все еще хотите использовать,@RunWith(MockitoJUnitRunner.class)
попробуйте отладить свою логику, если функция, которую вы высмеяли, действительно вызывается или нет.источник