對於一組JUnit 4.11測試,我創建了一個自己的註釋(我們稱之爲@MyTest
),我將其應用於某些單元測試。現在,我必須用@Test
和@MyTest
對這些測試進行註釋 - 這不是我認爲的最佳解決方案。由於繼承是不可能的註釋我已經嘗試建立一個自定義亞軍,但迄今沒有成功。這裏是什麼樣子至今:爲JUnit創建自己的@Test註釋
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 { }
該死的@保留註釋...這麼簡單,但那是我忘了一件事。 :-D改變'computeTestMethods()'也是一個好點,我認爲既然'JUnit4Builder'和我自己的Builder都可以完成這項工作,但顯然不是。不管怎樣,謝謝! :-) – blalasaadri