Fino a questo post che ho fatto la mia convalida eccezione in questo modo:
try {
myObject.doThings();
fail("Should've thrown SomeException!");
} catch (SomeException e) {
assertEquals("something", e.getSomething());
}
Ho trascorso alcuni momenti a pensare al problema e ho trovato il seguente (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);
Guardando questi due non riesco a decidere quale mi piace di più. Immagino che questo sia uno di quei problemi in cui il raggiungimento di un obiettivo (nel mio caso, il metodo di asserzione con parametro functor) non vale la pena a lungo termine poiché è molto più facile fare quei 6 o più di codice per asserire il tentativo .. blocco di blocco.
Quindi, ancora una volta, forse il mio risultato di 10 minuti di risoluzione dei problemi di venerdì sera non è il modo più intelligente per farlo.
Ti sarei grato se tu fossi in grado di verificare la risposta più adatta come quella corretta. – guerda
Non ci si deve preoccupare del metodo * which * che genera l'eccezione: questo è un dettaglio di implementazione. – Raedwald