私はjunitテストでmockitoを使っています。どのようにして例外を発生させ、そしてそれがそれを持っていると主張するのですか(一般的な擬似コード)
あなたの2番目の質問に最初に答えるために。 JUnit 4を使用している場合は、テストに注釈を付けることができます。
@Test(expected=MyException.class)
例外が発生したことを表明する。そして、mockitoで例外を「モック」するには、
when(myMock.doSomething()).thenThrow(new MyException());
例外メッセージもテストしたい場合は、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"));
}
このように例外を起こします。
when(obj.someMethod()).thenThrow(new AnException());
あなたのテストがそのような例外を投げると主張することによってそれが起こったことを確かめてください:
@Test(expected = AnException.class)
または通常のモック検証では:
verify(obj).someMethod();
テストが中間コードが例外を処理することを証明するように設計されている場合、後者のオプションが必要です(つまり、例外はテストメソッドからスローされません)。
JUnit 4、およびMockito 1.10.xを使用している場合は、テストメソッドに注釈を付けます。
@Test(expected = AnyException.class)
そしてあなたの希望する例外の使用を投げるために:
Mockito.doThrow(new AnyException()).when(obj).callAnyMethod();
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
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);
}
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
Mockitoとは無関係に、例外をキャッチしてその特性を表明することができます。例外が発生したことを確認するには、例外をスローするステートメントの後のtryブロック内でfalse条件をアサートします。
あるいはあなたの例外がクラスのコンストラクタから投げられるならば:
@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);
}