J'ai un test qui attend une exception particulière, par exemple: Je sais que je pouvais simplement écrire le test de vérification de la logique moi-même sans utiliser myMethod () code> méthode jette une sous-classe de
myException Code>, appelle-le
mysubclassxception code>. p>
@Test code> pour accepter les sous-classes de
MyException code> ainsi que la classe elle-même? Strong> p>
attendu code> en attrapant l'exception et fixer un drapeau, mais je me demandais si Junit a déjà soutenu des sous-classes d'exception correspondantes. p> p>
3 Réponses :
Ceci est déjà traité pour vous par le cadre
Prenons un petit exemple (très mauvais code):
Importation statique org.junit.assert. *; p> avec 2 classes d'exception myException et myextenceXception hériter de la précédente et une simple classe FOO comme celle-ci: p> @Override
public void evaluate() throws Exception {
boolean complete = false;
try {
fNext.evaluate();
complete = true;
} catch (AssumptionViolatedException e) {
throw e;
} catch (Throwable e) {
if (!fExpected.isAssignableFrom(e.getClass())) {
String message= "Unexpected exception, expected<"
+ fExpected.getName() + "> but was<"
+ e.getClass().getName() + ">";
throw new Exception(message, e);
}
}
if (complete)
throw new AssertionError("Expected exception: "
+ fExpected.getName());
}
Je déteste @Test (attendu =) un peu. La raison principale étant que c'est agréable pour des tests à une doublure où vous savez où l'exception proviendra, mais dès que vous avez deux lignes et que vous souhaitez affirmer que la deuxième ligne jette l'exception, vous êtes sol.
Le test passera si myException code> ou
mysubclassxception code> est lancé par
myMethod () code>. J'ai testé le concept avec ce code:
public class ExceptionTest {
private static class ExceptionA extends Exception {
}
private static class ExceptionB extends ExceptionA {
}
@Test(expected=ExceptionA.class)
public void test() throws Exception {
throw new ExceptionB();
}
}
Cas classique de l'erreur utilisateur - Le test qui a motivé cette question à défaillance, non pas parce que Junit ne correspondait pas correctement à l'exception, mais qu'il y a un cas particulier dans lequel l'exception n'est pas lancée pour être traitée dans le test