カスタムJUnit4ランナー(BlockJUnit4Runnerを拡張)を作成しました。このランナーの目的は、他のテストを実行する前に他のテストを有効にするために必要なテストを実行することです。たとえば、ファイルIOをテストしている場合、読み取り/書き込みテストでは、オープン/クローズテストが正しく機能する必要があります。
これにより、任意の数のrequiresでテストが適切に実行され、他に何も必要としないテストについては正常に報告されますが、別のrequiresを必要とするテストを実行すると、「Done:1/2」が表示され、イベントログに次のように表示されます。 「合格したテスト:1合格」。これは、必要なテスト(2番目に実行された)が失敗した場合でも当てはまります。
@Override
protected void runChild(FrameworkMethod method, RunNotifier notifier) {
if (!alreadyRunMethods.containsKey(method.getName())) {
boolean requiredMethodsPassed = true;
for (Annotation anno : method.getAnnotations()) {
if (anno instanceof Requires) {
requiredMethodsPassed = runRequiredMethods((Requires) anno, notifier, method);
break;
}
}
if (requiredMethodsPassed) {
super.runChild(method, notifier);
}else{
notifier.fireTestAssumptionFailed(new Failure(describeChild(method), new AssumptionViolatedException("Required methods failed.")));
}
}
}
private boolean runRequiredMethods(Requires req, RunNotifier notifier, FrameworkMethod parentMethod) {
boolean passed = true;
for (String methodName : req.value()) {
FrameworkMethod method = methodByName.get(methodName);
if (method == null) {
throw new RuntimeException(String.format("Required test method '%s' on test method '%s' does not exist.", methodName, parentMethod.getName()));
}
runChild(method, notifier);
Boolean methodPassed = alreadyRunMethods.get(method.getName());
methodPassed = methodPassed == null ? false : methodPassed;
passed &= methodPassed;
}
return passed;
}