Mój kod jest jak poniżej,
@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);
}
}
Jestem poniżej wyjątku
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)
Pomóż mi, jak to rozwiązać
@RunWith(MockitoJUnitRunner.Silent.class)
i nie jest CICHY@RunWith(MockitoJUnitRunner.Silent::class)
Najpierw sprawdź logikę testu. Zwykle są 3 przypadki. Po pierwsze, kpisz z niewłaściwej metody (popełniłeś literówkę lub ktoś zmienił testowany kod, tak że fałszywa metoda nie jest już używana). Po drugie, test kończy się niepowodzeniem przed wywołaniem tej metody. Po trzecie, twoja logika popada w błąd, jeśli / switch gałąź gdzieś w kodzie, więc mockowana metoda nie zostanie wywołana.
Jeśli jest to pierwszy przypadek, zawsze chcesz zmienić mockowaną metodę na używaną w kodzie. Z drugim i trzecim to zależy. Zwykle powinieneś po prostu usunąć tę makietę, jeśli nie ma ona zastosowania. Ale czasami w sparametryzowanych testach są pewne przypadki, które powinny pójść tą inną ścieżką lub zakończyć się niepowodzeniem wcześniej. Następnie możesz podzielić ten test na dwa lub więcej oddzielnych, ale nie zawsze wygląda to dobrze. 3 metody testowe z maksymalnie 3 argumentami, które dostawcy mogą sprawić, że test będzie wyglądał nieczytelnie. W takim przypadku dla JUnit 4 możesz wyciszyć ten wyjątek z jednym i drugim
adnotacja lub jeśli używasz podejścia regułowego
lub (to samo zachowanie)
W przypadku testów JUnit 5 można wyciszyć ten wyjątek za pomocą adnotacji dostarczonej w
mockito-junit-jupiter
pakiecie.źródło
Mockito.lenient().when(...)
; dla tego konkretnego pytania byłobyMockito.lenient().when(dao.doSearch(dto)).thenReturn(inspectionsSummaryList);
Milczenie nie jest rozwiązaniem. Musisz poprawić swoją próbę w swoim teście. Zobacz oficjalną dokumentację tutaj .
Niepotrzebne kody pośredniczące to wywołania metod, które nigdy nie zostały zrealizowane podczas wykonywania testu (zobacz także MockitoHint), przykład:
Zauważ, że jedna z metod skrótowych nigdy nie została zrealizowana w testowanym kodzie podczas wykonywania testu. Zagubiony fragment może być przeoczeniem dewelopera, artefaktem kopiowania i wklejania lub skutkiem niezrozumienia testu / kodu. Tak czy inaczej, programista kończy z niepotrzebnym kodem testowym. Aby baza kodu była czysta i łatwa do utrzymania, konieczne jest usunięcie niepotrzebnego kodu. W przeciwnym razie testy są trudniejsze do odczytania i uzasadnienia.
Aby dowiedzieć się więcej o wykrywaniu nieużywanych kiczów, zobacz MockitoHint.
źródło
U mnie ani te,
@Rule
ani@RunWith(MockitoJUnitRunner.Silent.class)
sugestie nie zadziałały. To był starszy projekt, w którym zaktualizowaliśmy do mockito-core 2.23.0.Mogliśmy się go pozbyć
UnnecessaryStubbingException
za pomocą:zamiast:
Nie trzeba dodawać, że powinieneś raczej spojrzeć na kod testowy, ale musieliśmy najpierw skompilować rzeczy i testy;)
źródło
when
Tutaj konfiguruje makiety coś zrobić. Jednak po tej linijce nie używasz już w żaden sposób tej makiety (poza zrobieniem averify
). Mockito ostrzega, że wwhen
związku z tym linia jest bezcelowa. Być może popełniłeś błąd logiczny?źródło
Service
), aby sprawdzić, czy działa poprawnie. W ogóle tego nie zrobiłeś, więc co tutaj testujesz?Patrząc na część śladu stosu, wygląda na to, że przegrywasz
dao.doSearch()
gdzie indziej. Bardziej przypomina wielokrotne tworzenie kodów pośredniczących tej samej metody.Rozważ na przykład poniższą klasę testową:
Wolałbym raczej rozważyć refaktoryzację twoich testów, aby zablokować je w razie potrzeby.
źródło
Jeśli zamiast tego używasz tego stylu:
zamień na:
źródło
Miałem,
UnnecessaryStubbingException
gdy próbowałem użyćwhen
metod na obiekcie szpiegowskim.Mockito.lenient()
wyciszył wyjątek, ale wyniki testu były nieprawidłowe.W przypadku obiektów Spy należy wywołać metody bezpośrednio.
źródło
Cóż, w moim przypadku błąd Mockito mówił mi, żebym wywołał właściwą metodę po
when
lubwhenever
. Ponieważ nie wywoływaliśmy warunków, z których przed chwilą wyśmiewaliśmy, Mockito zgłosił to jako niepotrzebne kody pośredniczące lub kod.Oto jak to było, kiedy nadchodził błąd:
następnie właśnie wywołałem właściwą metodę wspomnianą w instrukcji when, aby kpić z metody.
wprowadzone zmiany są jak poniżej
stockViewModelTest.getStockAvailability(listOf(), getStocksApiCallBack)
już działa.
źródło
Zastąpić
@RunWith(MockitoJUnitRunner.class)
z
@RunWith(MockitoJUnitRunner.Silent.class)
lub usuń
@RunWith(MockitoJUnitRunner.class)
lub po prostu zakomentuj niechciane kpiące połączenia (pokazane jako nieautoryzowane stubbing).
źródło
W przypadku dużego projektu trudno jest naprawić każdy z tych wyjątków. W tym samym czasie, używając
Silent
nie zaleca się . Napisałem skrypt, aby usunąć wszystkie niepotrzebne karczowce, podając ich listę.https://gist.github.com/cueo/da1ca49e92679ac49f808c7ef594e75b
Musimy tylko skopiować i wkleić
mvn
wynik i napisać listę tych wyjątków za pomocą wyrażenia regularnego, a skrypt zajmie się resztą.źródło
Jeśli używasz any () podczas mockowania, musisz zamienić miejsce @RunWith (MockitoJUnitRunner.class) z @RunWith (MockitoJUnitRunner.Silent.class).
źródło
any()
działa doskonale ze zwykłym biegaczem, gdy jest prawidłowo używany.Kiedy tworzysz makietę i ta makieta nie jest używana, zgłasza nieużywany wyjątek stubbing. W twoim przypadku ten mock nie jest faktycznie wywoływany. Dlatego rzuca ten błąd. W związku
@RunWith(MockitoJUnitRunner.class)
z@RunWith(MockitoJUnitRunner.Silent.class)
tym zmiana miejsca z którą usunie błąd. Jeśli nadal chcesz użyć,@RunWith(MockitoJUnitRunner.class)
spróbuj debugować swoją logikę, jeśli funkcja, którą mockujesz, jest faktycznie wywoływana, czy nie.źródło