由于IgnoredBuilder中是通過讀取類注解的方法,我們不妨類似定義自己的Ignore注解:
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.TYPE })
public @interface MyIgnore {
String value() default "";
}
然后,新建與JUnit源碼中同名的包org.junit.internal.builders,并在其中新建同名文件AllDefaultPossibilitiesBuilder,拷貝進來JUnit同名文件的源碼,并修改/添加其中如下部分:
@Override
public Runner runnerForClass(Class<?> testClass) throws Throwable {
List<RunnerBuilder> builders= Arrays.asList(
ignoredBuilder(),
myBuilder(),
annotatedBuilder(),
suiteMethodBuilder(),
junit3Builder(),
junit4Builder());
for (RunnerBuilder each : builders) {
Runner runner= each.safeRunnerForClass(testClass);
if (runner != null)
return runner;
}
return null;
}
protected MyBuilder myBuilder() {
return new MyBuilder();
}
并在這個包下,定義自己的Builder:
public class MyBuilder extends RunnerBuilder {
@Override
public Runner runnerForClass(Class<?> testClass) throws Throwable {
if (testClass.getAnnotation(MyIgnore.class) != null) {
if (...) //自定義過濾條件
return new IgnoredClassRunner(testClass);
}
return new BlockJUnit4ClassRunner(testClass);
}
}
這樣,只要在測試類上添加自定義注解@MyIgnore,即可根據(jù)自定義過濾條件決定該類運行與否。