私は、このメソッドをテストしようとしている:ここでvoidメソッドがMockitoとcatch-exceptionを使用して例外をスローすることをアサートする方法は?
public void deleteCurrentlyLoggedInUser(Principal principal) {
if (findLoggedInUser(principal) == null) {
throw new UserAlreadyDeletedException();
}
userRepository.delete(findLoggedInUser(principal));
}
がfindLoggedInUserです:
User findLoggedInUser(Principal principal) {
return userRepository.findByUsername(principal.getName());
}
そしてここでは、これまでのところ、私のテストです:
@Test
public void shouldThrowExceptionWhenUserNotFound() {
// given
when(sut.findLoggedInUser(principalStub)).thenReturn(null);
// when
sut.deleteCurrentlyLoggedInUser(principalStub);
// then
catchException
verify(userRepositoryMock, never()).delete(any(User.class));
}
それでは、どのように私は例外をキャッチしますここでcatch-exceptionを使用していますか?私がテストしているメソッドはvoidを返し、例外が見つかったと主張する方法を見つけることができないようです。
編集:私は@Test(expected = UserAlreadyDeletedException.class)
を使用することができると知っていますが、これははるかに優れており、@Testで期待される使用法は非常に妥当ではないため、私のプロジェクト全体をcatch例外に切り替える必要があります。
'expected = SomeException.class'は使用しないでください。メソッド内のどの式が実際に例外をスローするかについてのコントロールや可視性はありません。その上に 'try/catch'を使用することが望ましいです。なぜなら、投げを行うことを期待するものを正確に示すことができるからです。 –
@AndyTurner私は、あなたが単一のユニットテストで 'SomeException'を投げることができるものが複数ある場合、そのユニットテストを分割する必要があると主張します。 –
@JoeCはい、しかし:最も単純なテストを除いて、あなたはおそらくテストケース固有の設定を行うための作業をしています。あなたが捉えているものによっては、これらの設定アクションの1つが同じ例外をスローし、実際にはテストに合格しない印象を与えてしまうかもしれません。 –