Cum de a crea o adnotare proprie pentru junit care va sări peste testul dacă excepția concretă a fost aruncată în timpul executării?

Aplicația mea are mai multe moduri de execuție, iar în 1 mod este normal ca unele dintre testele mele să aducă o excepție concretă. Trebuie să adnotăm această metodă cu ceva de genul @SkipOnFail care va seta metoda ca fiind omisă dacă excepția ar fi fost aruncată.

mulțumesc anticipat!

@Edit (pentru ca întrebarea mea să fie mai clară)

@Test(expected=ConcreteException.class)

nu funcționează pentru mine deoarece am nevoie de testele mele să treacă chiar dacă ConcreteException.class nu a fost aruncat (eticheta așteptată în junit va marca testul meu ca eșuat dacă această excepție nu va fi aruncată) și să fie ignorat altfel. În toate celelalte cazuri, ar trebui să funcționeze ca întotdeauna.

@ Solution care a lucrat pentru mine (junit v4.7) thx la @axtavt

@Rule
public MethodRule skipRule = new MethodRule() {
    public Statement apply(final Statement base, FrameworkMethod method, Object target) {
        if(method.getAnnotation(SkipOnFail.class) == null) return base;

        return new Statement() {
            @Override
            public void evaluate() throws Throwable {
                try{
                    base.evaluate();
                } catch (ConcreteException e) {
                    Assume.assumeTrue(false);
                }
            }
        };
    }
};

@Mersi

0
Ce vrei să spui că testul este omis? Este ignorat cumva sau pur și simplu tăcut?
adăugat autor Piotr Kochański, sursa
De ce nu folosiți o încercare de captură cu excepția de beton?
adăugat autor richarbernal, sursa
Nu pot stabili proprietatea de adnotare așteptată pentru metoda @Test deoarece, în conformitate cu javitoc junit dacă metoda nu aruncă o excepție sau dacă aruncă o excepție diferită de cea declarată, testul eșuează. dar am nevoie de metoda mea pentru a reuși dacă nu a fost aruncată nicio excepție și să fie omisă dacă ar fi aruncat o excepție concretă.
adăugat autor user1424316, sursa
De ce nu folosiți adnotarea @Expected jUnit?
adăugat autor Alex, sursa

3 răspunsuri

Cum se utilizează Extensiile JUnit ?

Următorul exemplu este luat din Tutorial .

Oferă adnotări adiționale pentru Cerințe preliminare (@Precondiționate): Ignoră testele în funcție de condiții.

Abordarea necesară ar fi verificarea acestui lucru în timpul testelor de funcționare. Deci, puteți adăuga pur și simplu o adnotare @ Prerequisite (necesită = ") .

public class TestFillDatabase {
    @Prerequisite(requires = "databaseIsAvailable")
    @Test public void fillData() {
       //...
    }

    public boolean databaseIsAvailable() {
        boolean isAvailable = ...;
        return isAvailable;
    }
}
public class TestFillDatabase {
    @Prerequisite(requires = "databaseIsAvailable")
    @Test public void fillData() {
       //...
    }
    public boolean databaseIsAvailable() {
        boolean isAvailable = ...;
        return isAvailable ;
    }
}

Aceste metode specificate cu @Prerequisite (requires = "databaseIsAvailable") trebuie să fie o metodă publică, returnând o valoare booleană sau booleană.

Dacă aceste metode vor fi consolidate în clasele de ajutor, puteți specifica și metode statice într-o clasă care va fi apelată folosind @ Prerequisite (necesită "databaseIsAvailable", callee = "DBHelper") .

public class TestFillDatabase {
    @Prerequisite(requires = "databaseIsAvailable", callee="DBHelper")
    @Test public void fillData() {
       //...
    }
}
public class DBHelper {
    public static boolean databaseIsAvailable() {
        boolean isAvailable = ...;
        return isAvailable ;
    }
}
0
adăugat
Acest lucru nu funcționează pentru mine. Am nevoie de testul meu pentru a trece, dacă excepția nu a fost aruncată, să nu eșueze. Dar ar trebui să fie omis dacă o excepție concretă a fost aruncată.
adăugat autor user1424316, sursa
Astăzi am intrat într-un set de instrumente numit JUnitExt, așa că am actualizat răspunsul meu pentru a demonstra ceea ce cred că ar putea fi o soluție candidată pentru problema dvs.
adăugat autor Edwin Dalorzo, sursa

Nu cred că o astfel de caracteristică este disponibilă din cutie, dar ar trebui să fie destul de ușor de implementat cu personalizat TestRule și Să presupunem , ceva de genul:

@Rule
public TestRule skipRule = new TestRule() {
    public Statement apply(final Statement base, Description desc) {
         if (desc.getAnnotation(SkipOnFail.class) == null) return base;

         return new Statement() {
             public void evaluate() throws Throwable {
                 try {
                     base.evaluate();
                 } catch (MyExceptoion ex) {
                     Assume.assumeTrue(false);
                 }
             }
         };
    }
};
0
adăugat
De ce nu faci catch MyException în loc de orice Throwable ?
adăugat autor Louis Wasserman, sursa
@LouisWasserman: Bine, e mult mai clar.
adăugat autor axtavt, sursa

Am căutat documentele despre JUnit și se pare că din versiunea 4.9 au introdus ceea ce ei numesc reguli de test (vezi TestRule ). Puteți începe din asta.

Clasa ExpectedException marcată ca @ Regula ar putea fi de ajutor pentru a verifica excepțiile aruncate, dar nu obligatorii pentru ca testul să treacă.

Pentru o utilizare mai avansată, nu pot spune pentru moment, așa cum tocmai l-am descoperit.

0
adăugat