web-dev-qa-db-ja.com

Mockitoスローされた例外をモックにしてアサートする方法

私はjunitテストでmockitoを使っています。どのようにして例外を発生させ、そしてそれがそれを持っていると主張するのですか(一般的な擬似コード)

107
stackoverflow

BDD スタイルソリューション(Java 8に更新)

Mockito単独では例外処理の最善の解決策ではありません。Mockito with Catch-Exceptionを使用してください。

Mockito + キャッチ - 例外 + AssertJ

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

when(() -> myService.foo());

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

サンプルコード

依存関係

66
MariuszS

あなたの2番目の質問に最初に答えるために。 JUnit 4を使用している場合は、テストに注釈を付けることができます。

@Test(expected=MyException.class)

例外が発生したことを表明する。そして、mockitoで例外を「モック」するには、

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

例外メッセージもテストしたい場合は、MockitoでJUnitのExpectedExceptionを使用できます。

@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"));
}
20
Daniel Treiber

このように例外を起こします。

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

あなたのテストがそのような例外を投げると主張することによってそれが起こったことを確かめてください:

@Test(expected = AnException.class)

または通常のモック検証では:

verify(obj).someMethod();

テストが中間コードが例外を処理することを証明するように設計されている場合、後者のオプションが必要です(つまり、例外はテストメソッドからスローされません)。

15
Duncan Jones

JUnit 4、およびMockito 1.10.xを使用している場合は、テストメソッドに注釈を付けます。

@Test(expected = AnyException.class)

そしてあなたの希望する例外の使用を投げるために:

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

2015年6月19日の回答を更新しました(Java 8を使用している場合)。

Assertjを使うだけ

assertj-core-3.0.0 + Java 8 Lambdasの使用

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

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

11
Selwyn

MockitoのdoThrow を使用して、目的の例外をキャッチして後でスローされたことを表明します。

@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);
}
3
Rodrigo Martins

Mockitoを使うと、例外を起こすことができます。

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

Junit5を使用すると、exceptionをアサートでき、testingが呼び出されたときにthat exceptionがスローされるかどうかをアサートできます。

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

ここでサンプルを見つけてください: assert junit

1

Mockitoとは無関係に、例外をキャッチしてその特性を表明することができます。例外が発生したことを確認するには、例外をスローするステートメントの後のtryブロック内でfalse条件をアサートします。

0
eel ghEEz

あるいはあなたの例外がクラスのコンストラクタから投げられるならば:

@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