2017-03-22 2 views
11

My-Code ist wie unten,Wie unnötigen Stubbing Ausnahme

@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); 

     } 
} 

Ich erhalte unter Ausnahme

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) 

Bitte helfen Sie mir, wie zu lösen

Antwort

4
when(dao.doSearch(dto)).thenReturn(inspectionsSummaryList);//got error in this line 
verify(dao).doSearchInspections(dto); 
lösen

Die when konfiguriert hier Ihren Mock, um etwas zu tun. Allerdings verwenden Sie diesen Mock in keiner Weise mehr nach dieser Zeile (abgesehen von einer verify). Mockito warnt Sie, dass die when Linie daher sinnlos ist. Vielleicht hast du einen logischen Fehler gemacht?

+0

Danke für Ihre Hilfe – VHS

+0

Ich brauche beide, wann und überprüfen Aussagen freundlich vorschlagen, wie weiter – VHS

+2

Anruf bewegen eine Funktion Ihrer Testklasse ('Service'), um zu sehen, ob sie richtig reagiert. Das hast du überhaupt nicht gemacht, also was testest du hier? – john16384

18

Ersetzen Sie @RunWith(MockitoJUnitRunner.class) durch @RunWith(MockitoJUnitRunner.Silent.class).

+7

Willkommen. Es lohnt sich, Ihre Antwort zu aktualisieren, um zu erklären, warum sie den Code ersetzen sollten. Dies wird ihnen und zukünftigen Besuchern helfen zu verstehen. – Bugs

+5

Btw, es ist '@ RunWith (MockitoJUnitRunner.Silent.class)' und * nicht * SILENT – fgysin

+0

In Kotlin: '@ RunWith (MockitoJUnitRunner.Silent :: Klasse)' – Juancho

2

Mit Blick auf einen Teil Ihrer Stack-Trace sieht es so aus, als würden Sie die dao.doSearch() an anderer Stelle stubben. Mehr wie das wiederholte Erstellen der Stubs der gleichen Methode.

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. 

Betrachten Sie die folgenden Test-Klasse zum Beispiel:

@RunWith(MockitoJUnitRunner.class) 
public class SomeTest { 
    @Mock 
    Service1 svc1Mock1; 

    @Mock 
    Service2 svc2Mock2; 

    @InjectMock 
    TestClass class; 

    //Assume you have many dependencies and you want to set up all the stubs 
    //in one place assuming that all your tests need these stubs. 

    //I know that any initialization code for the test can/should be in a 
    //@Before method. Lets assume there is another method just to create 
    //your stubs. 

    public void setUpRequiredStubs() { 
     when(svc1Mock1.someMethod(any(), any())).thenReturn(something)); 
     when(svc2Mock2.someOtherMethod(any())).thenReturn(somethingElse); 
    } 

    @Test 
    public void methodUnderTest_StateUnderTest_ExpectedBehavior() { 
     // You forget that you defined the stub for svcMock1.someMethod or 
     //thought you could redefine it. Well you cannot. That's going to be 
     //a problem and would throw your UnnecessaryStubbingException. 
     when(svc1Mock1.someMethod(any(),any())).thenReturn(anyThing);//ERROR! 
     setUpRequiredStubs(); 
    } 
} 

ich eher Ihre Tests Refactoring erwägen würde, wo notwendig Stummel.

0

Wenn Sie diesen Stil verwenden statt:

@Rule 
public MockitoRule rule = MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS); 

ersetzen Sie es mit:

@Rule 
public MockitoRule rule = MockitoJUnit.rule().silent();