8
votes

Attendez-vous à une exception ou à l'une de ses sous-classes dans le test Junit à l'aide de @Test Annotation

J'ai un test qui attend une exception particulière, par exemple: xxx

myMethod () méthode jette une sous-classe de myException , appelle-le mysubclassxception .

est là pour définir mon test à l'aide de l'annotation @Test pour accepter les sous-classes de MyException ainsi que la classe elle-même?

Je sais que je pouvais simplement écrire le test de vérification de la logique moi-même sans utiliser attendu en attrapant l'exception et fixer un drapeau, mais je me demandais si Junit a déjà soutenu des sous-classes d'exception correspondantes.


1 commentaires

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


3 Réponses :


3
votes

Ceci est déjà traité pour vous par le cadre

Prenons un petit exemple (très mauvais code): Importation statique org.junit.assert. *; p> xxx pré>

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());
    }


1 commentaires

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.



3
votes

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();
    }
}


0 commentaires

0
votes

0 commentaires