Я размышляю об оптимальных методах обработки исключений и модульных тестов, потому что мы пытаемся внедрить некоторые лучшие практики кода.
В предыдущей статье о передовых методах, найденной в вики нашей компании, говорилось: «Не используйте try / catch, а используйте Junit4 @Test (Ожидается = MyException.class)», без дополнительной информации. Я не убежден.
Многие из наших пользовательских исключений имеют Enum для определения причины сбоя.
В результате я бы предпочел увидеть тест вроде:
@Test
public void testDoSomethingFailsBecauseZzz() {
try{
doSomething();
} catch(OurCustomException e){
assertEquals("Omg it failed, but not like we planned", FailureEnum.ZZZ, e.getFailure());
}
}
чем:
@Test(expected = OurCustomException.class)
public void testDoSomethingFailsBecauseZzz() {
doSomething();
}
когда doSomethig () выглядит так:
public void doSomething throws OurCustomException {
if(Aaa) {
throw OurCustomException(FailureEnum.AAA);
}
if(Zzz) {
throw OurCustomException(FailureEnum.ZZZ);
}
// ...
}
С другой стороны, я более чем убежден, что в некоторых случаях @Test (ожидается = blabla.class) - лучший выбор (например, когда исключение является точным и не может быть никаких сомнений относительно того, что его вызвало).
Я что-то здесь упускаю или мне нужно использовать try / catch при необходимости?