Sie können dies mit einer TestRule tun . Dies gibt Ihnen die Flexibilität, die Sie benötigen. Mit einer TestRule können Sie Logik um den Test einfügen, sodass Sie die Wiederholungsschleife implementieren würden:
public class RetryTest {
public class Retry implements TestRule {
private int retryCount;
public Retry(int retryCount) {
this.retryCount = retryCount;
}
public Statement apply(Statement base, Description description) {
return statement(base, description);
}
private Statement statement(final Statement base, final Description description) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
Throwable caughtThrowable = null;
for (int i = 0; i < retryCount; i++) {
try {
base.evaluate();
return;
} catch (Throwable t) {
caughtThrowable = t;
System.err.println(description.getDisplayName() + ": run " + (i+1) + " failed");
}
}
System.err.println(description.getDisplayName() + ": giving up after " + retryCount + " failures");
throw caughtThrowable;
}
};
}
}
@Rule
public Retry retry = new Retry(3);
@Test
public void test1() {
}
@Test
public void test2() {
Object o = null;
o.equals("foo");
}
}
Das Herzstück von a TestRule
ist das base.evaluate()
, das Ihre Testmethode aufruft. Um diesen Aufruf herum setzen Sie eine Wiederholungsschleife. Wenn in Ihrer Testmethode eine Ausnahme ausgelöst wird (ein Assertionsfehler ist tatsächlich ein Fehler AssertionError
), ist der Test fehlgeschlagen, und Sie werden es erneut versuchen.
Es gibt noch eine andere Sache, die von Nutzen sein kann. Möglicherweise möchten Sie diese Wiederholungslogik nur auf eine Reihe von Tests anwenden. In diesem Fall können Sie der Wiederholungsklasse über einem Test eine bestimmte Anmerkung zur Methode hinzufügen. Description
enthält eine Liste von Anmerkungen für die Methode. Weitere Informationen hierzu finden Sie in meiner Antwort auf So führen Sie Code vor jeder JUnit @ Test-Methode einzeln aus, ohne @RunWith oder AOP zu verwenden. .
Verwenden eines benutzerdefinierten TestRunner
Dies ist der Vorschlag von CKuck, Sie können Ihren eigenen Runner definieren. Sie müssen BlockJUnit4ClassRunner erweitern und runChild () überschreiben. Weitere Informationen finden Sie in meiner Antwort auf Definieren der JUnit-Methodenregel in einer Suite. . Diese Antwort beschreibt, wie Sie definieren, wie Code für jede Methode in einer Suite ausgeführt wird, für die Sie Ihren eigenen Runner definieren müssen.