Hasta este post he hecho mi validación excepción al hacer esto:
try {
myObject.doThings();
fail("Should've thrown SomeException!");
} catch (SomeException e) {
assertEquals("something", e.getSomething());
}
Sin embargo, me tomé unos momentos pensando en el problema y se me ocurrió lo siguiente (Java5, JUnit 3.x):
// Functor interface for exception assertion.
public interface AssertionContainer<T extends Throwable> {
void invoke() throws T;
void validate(T throwable);
Class<T> getType();
}
// Actual assertion method.
public <T extends Throwable> void assertThrowsException(AssertionContainer<T> functor) {
try {
functor.invoke();
fail("Should've thrown "+functor.getType()+"!");
} catch (Throwable exc) {
assertSame("Thrown exception was of the wrong type! Expected "+functor.getClass()+", actual "+exc.getType(),
exc.getClass(), functor.getType());
functor.validate((T) exc);
}
}
// Example implementation for servlet I used to actually test this. It was an inner class, actually.
AssertionContainer<ServletException> functor = new AssertionContainer<ServletException>() {
public void invoke() throws ServletException {
servlet.getRequiredParameter(request, "some_param");
}
public void validate(ServletException e) {
assertEquals("Parameter \"some_param\" wasn't found!", e.getMessage());
}
public Class<ServletException> getType() {
return ServletException.class;
}
}
// And this is how it's used.
assertThrowsException(functor);
Al mirar estos dos no puedo decidir cuál me gusta más. Supongo que este es uno de esos problemas en los que el logro de un objetivo (en mi caso, el método de aserción con el parámetro de functor) no vale la pena a largo plazo, ya que es mucho más fácil hacer esos 6+ de código para afirmar el intento Bloque de captura.
Por otra parte, tal vez mi resultado de 10 minutos para resolver problemas el viernes por la noche simplemente no sea la forma más inteligente de hacerlo.
Agradecería que pudieras comprobar que la respuesta correcta sea la correcta. – guerda
No debería importarle * qué * método arroja la excepción: es un detalle de implementación. – Raedwald