我做了以下定制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/