我创建了两个 Runner,它们都继承自 BlockJUnit4ClassRunner。一种是根据条件过滤一些测试。另一种是同时运行测试多个方法。我想同时应用这两个运行器,以便根据条件同时运行测试。
问题是我们不能根据 jUnit 中的Multiple RunWith Statements将多个 @RunWith 注释到相同的测试中。
我的问题是,由于这两个跑步者都是从同一个基类 BlockJUnit4ClassRunner 继承的,我可以将这两个跑步者合并为一个,以便 RunWith 这个跑步者,我可以根据条件并使用并发方式运行测试方法吗?以及如何做到这一点?
这是我创建的两个跑步者:
1) 此运行器根据 FunctionalTestFilter 中定义的一些条件运行测试方法:
public class FilterRunner extends BlockJUnit4ClassRunner {
public FilterRunner(Class<?> clazz) throws InitializationError {
super(clazz);
Filter f = new FunctionalTestFilter();
try {
f.apply(this);
} catch (NoTestsRemainException ex) {
System.out.println("Warning! No method run in " + clazz.getName());
}
}
2) 这个运行器使用多线程同时运行测试方法:
public static class ConcurrentJunitMethodRunner extends BlockJUnit4ClassRunner {
public ConcurrentJunitMethodRunner(final Class<?> testclass) throws InitializationError {
super(testclass);
setScheduler(new RunnerScheduler() {
ExecutorService executorService = Executors.newFixedThreadPool(5);
CompletionService<Void> completionService = new ExecutorCompletionService<Void>(executorService);
Queue<Future<Void>> tasks = new LinkedList<Future<Void>>();
@Override
public void schedule(Runnable childStatement) {
tasks.offer(completionService.submit(childStatement, null));
}
@Override
public void finished() {
try {
while (!tasks.isEmpty())
tasks.remove(completionService.take());
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
while (!tasks.isEmpty())
tasks.poll().cancel(true);
executorService.shutdownNow();
}
}
});
}
}