どちらも BlockJUnit4ClassRunner から継承された 2 つのランナーを作成しました。1 つは、条件に基づいていくつかのテストをフィルタリングすることです。もう 1 つは、複数のメソッドを同時にテストすることです。テストが条件に基づいて同時に実行されるように、これらの両方のランナーを適用したいと考えています。
問題は、 jUnit の複数の RunWith ステートメント によると、複数の @RunWith を同じテストに注釈付けできないことです。
私の質問は、これら 2 つのランナーは両方とも同じ基本クラス BlockJUnit4ClassRunner から継承されているため、これら 2 つのランナーを 1 つに結合して、RunWith このランナーで、条件に基づいて並行してテスト メソッドを実行できるようにすることはできますか? そして、それを行う方法は?
作成したランナーは次の 2 つです。
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();
}
}
});
}
}