jUnit忽略基类中的@Test方法

mga*_*mer 17 java inheritance junit

比方说,我有一个名为测试类testFixtureA有几种方法testA,testB,testC,等,每个@Test注释.

现在让我说我将子类testFixtureA化为调用类testFixtureAB,我不会覆盖任何东西.testFixtureAB现在是空的.

当我从运行测试testFixtureAB,方法testA,testB以及testC因为测试运行不从类和基类的测试方法区分是通过测试运行执行.

如何强制测试运行器从基类中省略测试?

Mat*_*ynn 23

而且我不会覆盖任何东西.testFixtureAB现在是空的

有你的答案.如果您不想从主类运行testB,请覆盖它:

public class testFixtureAB extends testFixtureA {
   @Override
   public void testB() {}
}
Run Code Online (Sandbox Code Playgroud)


Boz*_*zho 20

重构您的测试类.

  • 如果您不想使用基类中的测试,则不要扩展它
  • 如果您需要基类中的其他功能,请将该类拆分为两个 - 测试和其他功能

  • 这是无用的,因为@martosoler 在下面的答案中指出 - 有明显的情况(在我的情况下,Selenium 针对不同浏览器进行测试)这是非常糟糕的建议。你有时*想要*相同的行为;只有“SUT”变量的设置在子类之间有所不同。 (2认同)
  • @MikeBurton - 实际上,这是一个很好的建议,尽管 Bozho 的建议可能并不明显。您需要做的是“重构”您的基类,将应重用的代码提取到新的(抽象)原型基类中。然后,您的新测试类将扩展原始基类,而不是我们所说的基类。这将是遵循 LSP 和永远不应该覆盖具体实现的一般规则的一个很好的例子。如果您不介意违反这些规则,可以遵循我下面的建议。 (2认同)

dfa*_*dfa 11

忽略整个基类:

@Ignore
class BaseClass {
   // ...
}
Run Code Online (Sandbox Code Playgroud)

看看这个例子

  • 继承的测试方法将作为派生类中的测试执行... (6认同)
  • 这将忽略所有基类,使其基本无用. (3认同)
  • 使基类抽象? (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;
    }

}
Run Code Online (Sandbox Code Playgroud)

在你的自定义跑步者:

 /**
 * @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);
    }
}
Run Code Online (Sandbox Code Playgroud)