it-swarm.com.de

Mockito Wie spottet und behauptet man eine geworfene Ausnahme?

Ich benutze Mockito in einem Junit-Test. Wie lässt sich eine Ausnahme zustande bringen und dann behaupten, dass dies der Fall ist (generischer Pseudo-Code)?

96
stackoverflow

BDD Style-Lösung

Mockito alleine ist nicht die beste Lösung für die Behandlung von Ausnahmen. Verwenden Sie Mockito mit Catch-Exception

Mockito + Catch-Exception + AssertJ

given(otherServiceMock.bar()).willThrow(new MyException());

when(myService).foo();

then(caughtException()).isInstanceOf(MyException.class);

Beispielcode

Abhängigkeiten

  • eu.codearte.catch-exception: catch-exception: 1.3.3
  • org.assertj: assertj-core: 1.7.0

Nachteil

  • Es wird nur Mockito bis 1.10.8 unterstützt
62
MariuszS

Um Ihre zweite Frage zuerst zu beantworten. Wenn Sie JUnit 4 verwenden, können Sie Ihren Test mit kommentieren 

@Test(expected=MyException.class)

behaupten, dass eine Ausnahme eingetreten ist. Und um eine Ausnahme mit Mockito zu "verspotten", verwenden Sie

when(myMock.doSomething()).thenThrow(new MyException());
163
NilsH

Wenn Sie auch die Ausnahmemeldung testen möchten, können Sie die ExpectedException von JUnit mit Mockito verwenden:

@Rule
public ExpectedException expectedException = ExpectedException.none();

@Test
public void testExceptionMessage() throws Exception {
    expectedException.expect(AnyException.class);
    expectedException.expectMessage("The expected message");

    given(foo.bar()).willThrow(new AnyException("The expected message"));
}
19
Daniel Treiber

Lassen Sie die Ausnahme folgendermaßen passieren:

when(obj.someMethod()).thenThrow(new AnException());

Stellen Sie sicher, dass dies geschehen ist, indem Sie behaupten, dass Ihr Test eine solche Ausnahme auslöst:

@Test(expected = AnException.class)

Oder durch normale Scheinprüfung:

verify(obj).someMethod();

Die letztere Option ist erforderlich, wenn Ihr Test nachweist, dass Zwischencode die Ausnahme behandelt (d. H. Die Ausnahme wird nicht von Ihrer Testmethode ausgelöst).

15
Duncan Jones

Wenn Sie JUnit 4 und Mockito 1.10.x verwenden Kommentieren Sie Ihre Testmethode mit:

@Test(expected = AnyException.class)

und um die gewünschte Ausnahme zu verwenden, verwenden Sie:

Mockito.doThrow(new AnyException()).when(obj).callAnyMethod();
12
Prashant Kumar

Aktualisierte Antwort für den 19.06.2015 (wenn Sie Java 8 verwenden)

Verwenden Sie einfach assertj

Assertj-core-3.0.0 + Java 8 Lambdas verwenden 

@Test
public void shouldThrowIllegalArgumentExceptionWhenPassingBadArg() {
assertThatThrownBy(() -> myService.sumTingWong("badArg"))
                                  .isInstanceOf(IllegalArgumentException.class);
}

Referenz: http://blog.codeleak.pl/2015/04/junit-testing-exceptions-with-Java-8.html

10
Selwyn

Mit mockito können Sie die Ausnahme auslösen.

when(testingClassObj.testSomeMethod).thenThrow(new CustomException());

Mit Junit5 können Sie eine Ausnahme geltend machen, die feststellt, ob diese Ausnahme ausgelöst wird, wenn die Testmethode wird aufgerufen.

@Test
@DisplayName("Test assert exception")
void testCustomException(TestInfo testInfo) {
    final ExpectCustomException expectEx = new ExpectCustomException();

     InvalidParameterCountException exception = assertThrows(InvalidParameterCountException.class, () -> {
            expectEx.constructErrorMessage("sample ","error");
        });
    assertEquals("Invalid parametercount: expected=3, passed=2", exception.getMessage());
}

Finden Sie hier ein Beispiel: assert exception junit

2

Verwenden Sie Mockito's doThrow und fangen Sie dann die gewünschte Ausnahme ein, um zu bestätigen, dass sie später ausgelöst wurde.

@Test
public void fooShouldThrowMyException() {
    // given
    val myClass = new MyClass();
    val arg = mock(MyArgument.class);
    doThrow(MyException.class).when(arg).argMethod(any());
    Exception exception = null;

    // when
    try {
        myClass.foo(arg);
    } catch (MyException t) {
        exception = t;
    }

    // then
    assertNotNull(exception);
}
1
Rodrigo Martins

Ohne Bezug zu Mockito kann man die Ausnahme fangen und ihre Eigenschaften geltend machen. Um zu überprüfen, ob die Ausnahme aufgetreten ist, geben Sie nach der Anweisung, die die Ausnahme auslöst, eine falsche Bedingung im try-Block an.

0
eel ghEEz

Oder wenn Ihre Ausnahme vom Konstruktor einer Klasse ausgelöst wird: 

@Rule
public ExpectedException exception = ExpectedException.none();

@Test
public void myTest() {    

    exception.expect(MyException.class);
    CustomClass myClass= mock(CustomClass.class);
    doThrow(new MyException("constructor failed")).when(myClass);  

}
0
JediCate