Możesz to zrobić za pomocą TestRule . Zapewni to elastyczność, której potrzebujesz. TestRule umożliwia wstawienie logiki wokół testu, więc zaimplementowałbyś pętlę ponawiania:
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");
}
}
Sercem a TestRule
jest base.evaluate()
, który wywołuje Twoją metodę testową. Więc wokół tego wywołania umieszczasz pętlę ponawiania. Jeśli w metodzie testowej zostanie zgłoszony wyjątek (awaria potwierdzenia to w rzeczywistości an AssertionError
), oznacza to, że test się nie powiódł i spróbujesz ponownie.
Jest jeszcze jedna rzecz, która może się przydać. Możesz chcieć zastosować tę logikę ponawiania tylko do zestawu testów, w takim przypadku możesz dodać do klasy Retry powyżej testu dla określonej adnotacji w metodzie. Description
zawiera listę adnotacji dla metody. Aby uzyskać więcej informacji na ten temat, zobacz moją odpowiedź na temat Jak uruchomić kod przed każdą metodą JUnit @Test indywidualnie, bez użycia @RunWith ani AOP? .
Korzystanie z niestandardowego narzędzia TestRunner
To jest sugestia CKucka, możesz zdefiniować własnego Runnera. Musisz rozszerzyć BlockJUnit4ClassRunner i nadpisać runChild (). Aby uzyskać więcej informacji, zobacz moją odpowiedź na temat Jak zdefiniować regułę metody JUnit w zestawie? . Ta odpowiedź zawiera szczegółowe informacje, jak zdefiniować sposób uruchamiania kodu dla każdej metody w pakiecie, dla którego musisz zdefiniować własnego Runnera.