Во-первых, я согласен с GhostCat.
Испытательный код Flakey является реальной проблемой.
Но если " flakeyness " отсутствует в вашем коде (например, плохое сетевое соединение с внешним веб-сервисом), то может быть полезно повторно запустить тесты.
В этом случае вы можете сделать следующее.
Сначала создайте аннотацию интерфейса.(Это будет использоваться для указания того, какие тесты требуют повторной попытки.)
@Retention(RetentionPolicy.RUNTIME)
public @interface Retry {}
Затем TestRule
, который будет применен к нашему тесту.(Это правило будет проверять неудачу, если присутствует аннотация Retry
)
public class RetryRule implements TestRule {
@Override
public Statement apply(Statement base, Description method) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
try {
base.evaluate();
} catch (Throwable t) {
Retry retry = method.getAnnotation(Retry.class);
if (retry != null) {
base.evaluate();
} else {
throw t;
}
}
}
};
}
}
Наконец, в нашем тесте мы собрали все вместе
public class RetryTest {
private static int count = 0;
@Rule
public RetryRule rule = new RetryRule();
@Test
@Retry
public void testToRetry() throws Exception {
callMyFlakeyCode();
}
}