Estoy reflexionando sobre el manejo de excepciones y las mejores prácticas de pruebas unitarias porque estamos tratando de implementar algunas de las mejores prácticas de código.JUnit4 @Test (expected = MyException.class) VS try/catch
Un artículo anterior sobre mejores prácticas, que se encuentra en la wiki de nuestra compañía, indicó "No use try/catch, pero use Junit4 @Test (expect = MyException.class)", sin más información. No estoy convencido.
Muchas de nuestras excepciones personalizadas tienen un Enum para identificar la causa del error. Como resultado de ello, prefiero ver una prueba como:
@Test
public void testDoSomethingFailsBecauseZzz() {
try{
doSomething();
} catch(OurCustomException e){
assertEquals("Omg it failed, but not like we planned", FailureEnum.ZZZ, e.getFailure());
}
}
que:
@Test(expected = OurCustomException.class)
public void testDoSomethingFailsBecauseZzz() {
doSomething();
}
cuando doSomethig() se parece a:
public void doSomething throws OurCustomException {
if(Aaa) {
throw OurCustomException(FailureEnum.AAA);
}
if(Zzz) {
throw OurCustomException(FailureEnum.ZZZ);
}
// ...
}
En una nota lateral, yo soy más que convencidos de que en algunos casos @Test (expected = blabla.class) ES la mejor opción (por ejemplo, cuando la excepción es precisa y no puede haber ninguna duda sobre qué la causa).
¿Me falta algo aquí o debo presionar el uso de try/catch cuando sea necesario?
De hecho, estoy bastante feliz cuando los veo diciendo que la jerarquía de excepciones es sospechosa, me ha estado molestando por un tiempo. (Puede ser por eso que estoy reflexionando sobre estos temas;)). ¡Gracias! – Stph