@MyTest
JUnit 4.11 テストのセットに対して、いくつかの単体テストに適用する独自の注釈 (と呼びましょう) を作成しました。現状では、これらのテストに と の両方で注釈を付ける必要が@Test
あります@MyTest
- 私が考える最良の解決策ではありません。注釈では継承ができないため、カスタムランナーを構築しようとしましたが、これまでのところ成功していません。これまでの様子は次のとおりです。
public class MyRunner extends Suite {
public MyRunner(Class<?> klass, RunnerBuilder builder)
throws InitializationError {
super(klass, modifyBuilder(builder));
}
private static final RunnerBuilder modifyBuilder(RunnerBuilder builder) {
if(AllDefaultPossibilitiesBuilder.class.isAssignableFrom(builder.getClass())) {
return new AllDefaultPossibilitiesBuilder(true) {
@Override
public Runner runnerForClass(Class<?> testClass)
throws Throwable {
List<RunnerBuilder> builders = Arrays.asList(
ignoredBuilder(),
annotatedBuilder(),
suiteMethodBuilder(),
junit3Builder(),
junit4Builder(),
myTestBuilder());
for (RunnerBuilder each : builders) {
Runner runner = each.safeRunnerForClass(testClass);
if (runner != null) {
return runner;
}
}
return null;
}
private RunnerBuilder myTestBuilder() {
return new RunnerBuilder() {
@Override
public MyAnnotationRunner runnerForClass(Class<?> testClass)
throws Throwable {
return new MyAnnotationRunner(testClass);
}
};
}
};
} else {
return builder;
}
}
}
そしてMyAnnotationRunner
クラス:
public class MyAnnotationRunner extends BlockJUnit4ClassRunner {
public MyAnnotationRunner(Class<?> klass) throws InitializationError {
super(klass);
}
@Override
protected List<FrameworkMethod> computeTestMethods() {
return getTestClass().getAnnotatedMethods(MyTest.class);
}
@Override
protected void validateTestMethods(List<Throwable> errors) {
validatePublicVoidNoArgMethods(MyTest.class, false, errors);
}
}
@MyTest
ただし、これまでのところ、テストを実行すると、注釈は気にしません。実際、ビルダーリストの行をコメントアウトすると、junit4Builder(),
テストはまったく実行されません。
私は間違った方向に進んでいますか、それともこれは正しい考えですが、これまでのところ不完全ですか? (そして、誰かがそれを提案したい場合に備えて、TestNG または別のテスト フレームワークに切り替えることはできません。)
編集:
解決策 (Bobbo によって提案された) は、上記のコードにはありませんでした - それはすべて正しいようです。@MyTest
ただし、注釈には注釈がありませんでした@Retention
。正しい定義は次のようになります。
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest { }