jUnit忽略基类中的@Test方法

假设我有一个名为testFixtureA的测试类, testFixtureA有几个方法testAtestBtestC等,每个方法都有@Test注释。

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

当我从testFixtureAB运行测试时, testAtestBtestC方法由测试testC器执行,因为测试运行器不区分类和基类的测试方法。

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

重构您的测试类。

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

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

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

 public class testFixtureAB extends testFixtureA { @Override public void testB() {} } 

忽略整个基类:

 @Ignore class BaseClass { // ... } 

看看这个例子

实现几个类很容易实现:

  • 创建自己的TestRunner
  • 创建像@IgnoreInheritedTests这样的注释
  • 创建一个扩展org.junit.runner.manipulation.Filter的类

在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); } } 

在最新的JUnit中,您可以使用子类上的@Rule注释来检查测试名称并拦截测试运行以动态忽略测试。 但我建议@Bozho的想法是更好的 – 你需要这样做的事实表明一个更大的问题,可能显示inheritance不是这里的正确解决方案。

我知道,这不是答案……

考虑扩展具体测试类的原因。 你以这种方式复制测试方法。

如果您在测试之间共享代码,那么考虑使用帮助程序和夹具设置方法或测试帮助程序类编写基本测试类 。

如果要运行测试,请尝试使用套件和类别组织测试。

如果要对同一测试套件的不同配置执行相同的测试,该怎么办?

例如,假设你有A类,其中test1,test2和test3方法遇到嵌入式数据库,那么你想为每个嵌入式供应商(H2,HyperSQL等)创建单独的“setUp”和“tearDown”,但运行相同的测试每一个人。

我想扩展一个包含这些测试方法的类,并在子类中进行配置。 我的问题是超级class不应该被认为有资格参加测试运动员。 当测试运行器执行超级类并且给定没有找到相应的设置和拆卸方法时,问题就出现了,它崩溃了:(

在基础测试类’@Test方法中:

 assumeTrue(getClass().equals(BaseClassTest.class)); 

它将忽略子类测试中的那些,但不会完全忽略它们。