2012-10-22 4 views

Antwort

9

Leider müssen Sie diese Logik codieren. JUnit hat keine solche Funktion. Im Allgemeinen haben Sie 2 Lösungen:

  1. Nur separaten Testfall 2 Testfälle: eine, die Tests enthält, die „vor“ läuft und zweitens, dass enthält Tests erfordern, dass dies nicht erforderlich ist.
  2. Implementieren Sie Ihren eigenen Testlauf und kommentieren Sie Ihren Test, um ihn zu verwenden. Erstellen Sie Ihre eigene Annotation @RequiresBefore und markieren Sie Tests, die dies mit dieser Annotation benötigen. Der Test-Runner analysiert die Anmerkung und entscheidet, ob die "Vorher" -Methode ausgeführt werden soll oder nicht.

Die zweite Lösung ist klarer. Das erste ist einfacher. Es liegt an Ihnen, einen von ihnen zu wählen.

15

Verwenden Sie den Runner @Enclosed, um zwei interne Testklassen zu ermöglichen. Eine mit der erforderlichen @Before Methode, die andere ohne.

Enclosed

@RunWith(Enclosed.class) 
public class Outter{ 

    public static class Inner1{ 

    @Before public void setup(){} 

    @Test public void test1(){} 
    } 

    public static class Inner2{ 

    // include or not the setup 
    @Before public void setup2(){} 

    @Test public void test2(){} 
    } 

} 
19

Sie können dies mit einem TestRule. Sie markieren den Test, den Sie die zuvor mit einer Anmerkung von einiger Beschreibung überspringen wollen, und dann in der Anwendung Methode im TestRule, können Sie für diese Anmerkung testen und tun, was Sie wollen, so etwas wie:

public Statement apply(final Statement base, final Description description) { 
    return new Statement() { 
    @Override 
    public void evaluate() throws Throwable { 
     if (description.getAnnotation(DontRunBefore.class) == null) { 
     // run the before method here 
     } 

     base.evaluate(); 
    } 
    }; 
} 
+0

Hier ist der aktualisierte Link: https://github.com/junit-team/junit/wiki/Rules. Siehe auch: http://junit.org/apidocs/org/junit/rules/TestRule.html – Bowen

+4

Gibt es eine Möglichkeit, die @Before-Anweisungen innerhalb der TestRule einfach auszuführen? Ich frage mich, was der einfachste Ansatz für den '// run the before method here' Teil ist. – loeschg

0

Man kann das auch lösen, indem man das rückgängig macht, was in @Before Setup im Testfall getan wurde. Dies ist, wie es aussieht,

@Before 
public void setup() { 
    TestDataSetupClass.setupTestData(); 
} 

@Test 
public void testServiceWithIgnoreCommonSetup() { 
    TestDataSetupClass.unSet(); 
    //Perform Test 
} 

Es wird hier Vor-und Nachteile für Lösungen sein. Geringfügiger Nachteil ist ein unnötiger Zyklus des Einstellens und des Nicht-Setzen-Schritts. Aber es geht gut, wenn man es nur für einen Testfall von Hunderten tun muss und den Aufwand vermeidet, Selbst-AOP zu schreiben oder mehrere innere Testklassen zu unterhalten.

Verwandte Themen