Как применить @Rule JUnit для всех тестовых случаев в наборе

Я использую JUnit 4.10 для запуска наборов тестов и реализовал правило «повторить неудачный тест» в соответствии с удивительными заметками Мэтью Фаруэлла в Как немедленно повторно запустить неудачные тесты JUnit? пост. Я создал класс "RetryTestRule" со следующим кодом:

public class RetryTestRule implements TestRule {

  private final int retryCount;

  public RetryTestRule(int retryCount) {
    this.retryCount = retryCount;
  }

  @Override
  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;

        // retry logic
        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 в каждом тестовом случае набора вместо одной нотации в определении Suite, поэтому после небольшой проверки я попробовал новую нотацию @ClassRule в моем классе Suite:

@RunWith(Suite.class)
@SuiteClasses({
  UserRegistrationTest.class,
  WebLoginTest.class
})
public class UserSuite {    
  @ClassRule
  public static RetryTestRule retry = new RetryTestRule(2);
}

Проблема в том, что это не работает так, как ожидалось: неудачные тесты не повторяются. Кто-нибудь пробовал это и знает решение? Очень ценим помощь!

9
задан Community 23 May 2017 в 10:30
поделиться