Ви можете зробити це за допомогою TestRule . Це дасть вам необхідну гнучкість. TestRule дозволяє вставляти логіку навколо тесту, щоб ви реалізували цикл повторення:
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");
}
}
Серцем a TestRule
є те base.evaluate()
, що викликає ваш метод тестування. Отже, навколо цього дзвінка ви ставите цикл повторення. Якщо у вашому методі тесту видано виняток (помилка твердження насправді є AssertionError
), тоді тест не вдався, і ви спробуєте повторити.
Є ще одна річ, яка може бути корисною. Можливо, ви захочете застосувати цю логіку повторної спроби до набору тестів, і в цьому випадку ви можете додати до класу Retry вище тесту для певної анотації методу. Description
містить список анотацій до методу. Для отримання додаткової інформації про це див. Мою відповідь на тему Як запустити якийсь код перед кожним методом JUnit @Test окремо, не використовуючи @RunWith і AOP? .
Використання власного TestRunner
Це пропозиція CKuck, ви можете визначити власного Бігуна. Вам потрібно розширити BlockJUnit4ClassRunner і перевизначити runChild (). Для отримання додаткової інформації див. Мою відповідь на Як визначити правило методу JUnit у наборі? . Ця відповідь детально описує, як визначити, як запускати код для кожного методу в Suite, для якого вам потрібно визначити власний Runner.