java - 自定义 BlockJUnit4ClassRunner,运行测试套件设置次数

标签 java junit annotations

我做了以下定制BlockJUnit4ClassRunner

  public class RepeatEachTest extends BlockJUnit4ClassRunner {

  private int repeats;

  public RepeatEachTest(Class<?> klass) throws InitializationError {
    super(klass);
    Repeat r = klass.getAnnotation(Repeat.class);
    if (r == null) {
        throw new InitializationError("A @Repeat annonation must also be suplied to class, for example @Repeat(5) to repeat 5 times");
    }
    repeats = r.value();
  }

  @Override
  protected void runChild(FrameworkMethod method, RunNotifier notifier) {
    for (int i = 0; i < repeats; i++) {
        super.runChild(method, notifier);
    }
  }

  @Override
  public int testCount() {
    return repeats * super.testCount();
  }
}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Repeat {  
 int value();
}

执行每个测试@Repeat.value()次。测试运行

@RunWith(RepeatEachTest.class)
@Repeat(2)
public class RepeatEachTestTest {

  @Test
  public void first() {
    System.out.println("ran first");
  }

  @Test
  public void second() {
    System.out.println("ran second");
  }
}

看起来像

ran first
ran first
ran second
ran second

但现在我想实现第二个 BlockJUnit4ClassRunner它运行整个测试类 @Repeat.value() 次。从该设置运行看起来像

ran first
ran second
ran first
ran second

有什么想法吗?

最佳答案

这取决于你想要什么。如果您希望多次调用@BeforeClass@AfterClass方法和类规则,可以重写classBlock():

protected Statement classBlock(final RunNotifier notifier) {
  return new Statement() {
    @Override
    public void evaluate() throws Throwable {
      for (int i = 0; i < repeats; i++) {
        super.classBlock(notifier).evaluate();
      }
    }
  };
}

如果您希望调用一次 @BeforeClass@AfterClass 方法和类规则,请重写 childrenInvoker() (代码类似)。

但请注意,其中任何一个都会导致监听器多次收到测试已开始和完成的通知。在这种情况下,某些监听器可能无法正确行事。

关于java - 自定义 BlockJUnit4ClassRunner,运行测试套件设置次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15141593/

相关文章:

java - Jetty websocket client.start 不存在

java - 在不修改测试类的情况下排除单个 JUnit 测试方法?

java - 如何将字符串集合和每个元素验证为 URL?

java - Spring JDBC - Kafka Consumer 的可重试异常

java - 如何制作不区分大小写的 ConcurrentMap?

java - 检查用户手指索引或类型

grails - Grails单元测试:为什么此语句失败?

java - Maven 模块 Junit 测试

ios - 拖动注释时的回调

java - 定义注解只适用于静态方法