是的,我知道有一种方法,但它会让你编写一些额外的代码。
首先,JUnit 忽略您的 TestRule 的原因是因为它是在接口上声明的,因此是静态的(和最终的)。
为了克服这个问题,需要编写一个这样的自定义运行器:
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;
import org.junit.Rule;
import org.junit.rules.TestRule;
import org.junit.runners.BlockJUnit4ClassRunner;
import org.junit.runners.model.InitializationError;
public final class MyRunner extends BlockJUnit4ClassRunner {
public MyRunner(Class<?> klass) throws InitializationError {
super(klass);
}
@Override
protected List<TestRule> getTestRules(Object target) {
List<TestRule> testRules = super.getTestRules(target);
testRules.addAll(getStaticFieldTestRules(target));
return testRules;
}
private List<TestRule> getStaticFieldTestRules(Object target) {
List<TestRule> testRules = new ArrayList<>();
Class<?> clazz = target.getClass();
for (Field f : clazz.getFields()) {
if ((f.getModifiers() & Modifier.STATIC) != 0) {
if (f.isAnnotationPresent(Rule.class)) {
try {
testRules.add((TestRule) f.get(target));
} catch (IllegalArgumentException | IllegalAccessException e) {
throw new IllegalStateException(e);
}
}
}
}
return testRules;
}
}
最后,注释您的测试类以使用新的自定义运行程序运行,一切都如您所愿......
import org.junit.runner.RunWith;
@RunWith(MyRunner.class)
public class Test implements IBaseTest {
@org.junit.Test
public void testName1() throws Exception {
}
@org.junit.Test
public void testName2() throws Exception {
}
}