假设我有一个名为testFixtureA
的测试类,其中有多个方法testA
,testB
,testC
等,每个方法都带有@Test
注释。
现在让我说我将testFixtureA
子类化为名为testFixtureAB
的类,我不会覆盖任何内容。 testFixtureAB
现在是空的。
当我从testFixtureAB
运行测试时,方法testA
,testB
和testC
由测试运行器执行,因为测试运行器不区分测试方法与类和基类。
如何强制测试运行器从基类中省略测试?
答案 0 :(得分:22)
我不会覆盖任何东西。 testFixtureAB现在是空的
有你的答案。如果您不想从主类运行testB,请覆盖它:
public class testFixtureAB extends testFixtureA {
@Override
public void testB() {}
}
答案 1 :(得分:20)
重组您的测试类。
答案 2 :(得分:11)
答案 3 :(得分:8)
实现几个类很容易实现:
TestRunner
@IgnoreInheritedTests
org.junit.runner.manipulation.Filter
在过滤器类上:
public class InheritedTestsFilter extends Filter {
@Override
public boolean shouldRun(Description description) {
Class<?> clazz = description.getTestClass();
String methodName = description.getMethodName();
if (clazz.isAnnotationPresent(IgnoreInheritedTests.class)) {
try {
return clazz.getDeclaredMethod(methodName) != null;
} catch (Exception e) {
return false;
}
}
return true;
}
@Override
public String describe() {
// TODO Auto-generated method stub
return null;
}
}
在您的自定义选手上:
/**
* @param klass
* @throws InitializationError
* @since
*/
public CustomBaseRunner(Class<?> klass) throws InitializationError {
super(klass);
try {
this.filter(new InheritedTestsFilter());
} catch (NoTestsRemainException e) {
throw new IllegalStateException("class should contain at least one runnable test", e);
}
}
答案 4 :(得分:1)
在最新的JUnit中,您可以使用子类上的@Rule注释来检查测试名称并拦截测试运行以动态忽略测试。但我建议@Bozho的想法是更好的 - 你需要这样做的事实表明一个更大的问题可能表明继承在这里不是正确的解决方案。
答案 5 :(得分:1)
我知道,这不是答案......
考虑扩展具体测试类的原因。你这样做会重复测试方法。
如果您在测试之间共享代码,请考虑使用helper and fixture setup methods或test helper class编写基本测试类。
如果要运行测试,请尝试使用套件和categories组织测试。
答案 6 :(得分:1)
如果要对同一测试套件的不同配置执行相同的测试,该怎么办?
例如,假设你有A类,其中test1,test2和test3方法遇到嵌入式数据库,那么你想为每个嵌入式供应商(H2,HyperSQL等)创建单独的“setUp”和“tearDown”,但是运行对每一个进行相同的测试。
我想扩展一个包含这些测试方法的类,并在子类中配置它。我的问题是超级班不应该被认为有资格参加测试跑步者。当测试运行器执行超类并且没有找到相应的设置和拆卸方法时会出现问题,它会崩溃:(
答案 7 :(得分:1)
在Junit 5中,您可以将基类作为抽象类,并使用具体类对其进行扩展。
在IDE中运行摘要时,将改为执行子类。
答案 8 :(得分:0)
在基础测试类'@Test方法:
中assumeTrue(getClass().equals(BaseClassTest.class));
它将忽略子类测试中的那些但不完全将它们排除在外。
答案 9 :(得分:0)
如果出于某种原因您需要两个JUnit类来实现相同的功能,那么对我来说最好的方法是:
{
user_record(
id:"b8faaf26-c8a6-3560-8357-f789f3325b0c",
tenantReference:"lightcoral70"
)
{
id,
tenant_reference,
roles,
custom_attributes{
fred
}
}
中。TestFixture
和TestFixtureA
这样,您将不会重复代码,也不会重复运行。