実際、この場合の最善の解決策は、独自のorg.junit.Runner
. 見た目ほど複雑ではありません。簡単なサンプルは次のとおりです。
ランナー:
package foo.bar.test;
import org.junit.runner.Description;
import org.junit.runner.Runner;
import org.junit.runner.notification.Failure;
import org.junit.runner.notification.RunNotifier;
import org.junit.runners.JUnit4;
import org.junit.runners.model.InitializationError;
public class MyRunner extends Runner {
private final Runner runner;
public MyRunner(final Class<?> klass) throws InitializationError {
super();
this.runner = new JUnit4(klass);
}
@Override
public Description getDescription() {
return runner.getDescription();
}
@Override
public void run(final RunNotifier notifier) {
for (Description description : runner.getDescription().getChildren()) {
notifier.fireTestStarted(description);
try {
// here it is possible to get annotation:
// description.getAnnotation(annotationType)
if (MyConfiguration.shallExecute(description.getClassName(), description.getMethodName())) {
runner.run(notifier);
}
} catch (Exception e) {
notifier.fireTestFailure(new Failure(description, e));
}
}
}
}
テストケース:
package foo.bar.test;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(MyRunner.class)
public class TestCase {
@Test
public void myTest() {
System.out.println("executed");
}
}
そして構成クラス:
package foo.bar.test;
public class MyConfiguration {
public static boolean shallExecute(final String className, final String methodName) {
// your configuration logic
System.out.println(className + "." + methodName);
return false;
}
}
ここで素晴らしいのは、独自の注釈を実装できることです。たとえば: @TestKey("testWithDataBase")
、上記のサンプル ソースのコメントを参照してください。また、構成オブジェクトはテストを実行するかどうかを定義できるため、テストをグループ化できます。これは、グループ化する必要があるテストが多数ある場合に非常に役立ちます。