2013-04-05 7 views
17

Ich benutze Mockito. Ich möchte RuntimeException werfen, wenn unmounted Methode aufgerufen wird. Gibt es eine Möglichkeit, dies zu tun?werfen RuntimeException beim Aufrufen von unmounted Methode

+0

warum möchten Sie das tun? – Woot4Moo

+0

Genau was meinst du mit "unmoocked Methode" in diesem Zusammenhang? Alle Methoden in einer Klasse werden verspottet, wenn 'mock (...)'/'@ Mock' verwendet wird. –

+5

Weil ich oft vergessen, einige Methoden zu verspotten. Ausnahmen können helfen, diese Methoden zu finden. – Hlib

Antwort

20

Sie können eine Standardantwort für einen Schein festlegen. Alle Methoden, die nicht abgestempelt werden, verwenden diese Standardantwort.

public void testUnstubbedException() { 
    // Create a mock with all methods throwing a RuntimeException by default 
    SomeClass someClass = mock(SomeClass .class, new RuntimeExceptionAnswer()); 

    doReturn(1).when(someClass).getId(); // Must use doReturn 

    int id = someClass.getId(); // Will return 1 

    someClass.unstubbedMethod(); // Will throw RuntimeException 
} 

public static class RuntimeExceptionAnswer implements Answer<Object> { 

    public Object answer(InvocationOnMock invocation) throws Throwable { 
     throw new RuntimeException (invocation.getMethod().getName() + " is not stubbed"); 
    } 

} 

Beachten Sie, dass nicht Verwendung when mit dieser Funktionalität, da das Verfahren vor when (How does mockito when() invocation work?) genannt wird, und es wird eine RuntimeException werfen, bevor der mock in Modus stubbing geht.

Daher müssen Sie doReturn verwenden, damit dies funktioniert.

+2

Vielen Dank! Aber wenn ich 'when (someClass.unmpokedMethod()). ThanReturn ("huerga")' eingefügt habe, wird weiterhin die Ausnahme – Hlib

+4

ausgelöst. Sie müssen 'doReturn' anstelle von' when' verwenden. Ich habe meine Antwort mit dieser Lösung bearbeitet. –

+2

Danke! Das funktioniert wirklich! – Hlib

0

Sie verhöhnen eine ganze Klasse und das Ergebnis ist, dass alle Methoden Null zurückgeben werden.

Dann können Sie doReturn(...) verwenden, um dieses Verhalten zu ändern. Ähnlich können Sie doThrow(...) verwenden, um (wie ich mich erinnere, nur void) Methoden Ausnahmen auszulösen.

Beantwortet das Ihre Frage?

+1

Ich denke, er möchte sicherstellen, dass alle Methoden verspottet werden, zum Beispiel, dass Mockito eine Ausnahme auslöst, wenn eine Methode nicht verspottet wurde. –

+2

Ja! Aber ich möchte sicherstellen, dass alle Methoden, die aufgerufen werden, verspottet werden. – Hlib

+0

Alle Methoden in einer mocked Klasse _are_ verspottet - per Definition. –

12

Der beste Weg, dies zu tun, ist mit den statischen Methoden verifyNoMoreInteractions und ignoreStubs. Rufen Sie diese nach dem "Akt" -Teil Ihres Tests an. und Sie erhalten einen Fehler, wenn Methoden ohne Stubben aufgerufen, aber nicht verifiziert wurden.

verifyNoMoreInteractions(ignoreStubs(myMock)); 

Dies ist bei https://static.javadoc.io/org.mockito/mockito-core/2.8.47/org/mockito/Mockito.html#ignore_stubs_verification beschrieben, obwohl ich, dass das Codebeispiel glaube, dass es derzeit einen Druckfehler enthält.

+0

+1 Ich bevorzuge diese Lösung zu meinen. –

+4

Dies hilft nicht, wenn Ihr Test vor diesem Punkt aufgrund einer Null-Dereferenzierung, die durch einen Aufruf einer nicht angehängten Methode verursacht wurde, dunkel abgestürzt ist. –

+0

Ausgezeichnet. Ich frage mich, warum das in den Dokumenten so versteckt ist. –

Verwandte Themen