Я пытаюсь проверить этот метод:Как утверждать, что метод void генерирует исключение с использованием Mockito и исключения catch?
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, и я просто не могу найти способ утверждать, что это исключение найдено.
EDIT: Я знаю, что мог бы использовать: @Test(expected = UserAlreadyDeletedException.class)
, но я хочу переключить весь проект на исключение catch-exception, потому что он намного лучше, и использование ожидаемого в @Test не очень разумно.
Не используйте 'expected = SomeException.class'. У вас нет контроля или видимости, над которым выражение в методе действительно вызывает исключение. Предпочтительно использовать 'try/catch' над этим, потому что тогда вы можете точно показать, что вы ожидаете делать. –
@AndyTurner Я бы сказал, что если у вас есть несколько вещей, которые могут вызвать «SomeException» в одном блочном тесте, указанный модульный тест нужно разделить. –
@JoeC да, но: за исключением самых простых тестов, вы, вероятно, делаете что-то, чтобы сделать свою тестовую конкретную настройку; в зависимости от того, что вы ловите, одно из этих действий по настройке может вызвать одно и то же исключение, создавая впечатление, которое проходит ваш тест, когда на самом деле это не так. –