为什么JUnit 5测试不从抽象类继承@Test注释?

时间:2017-07-18 09:08:20

标签: java junit junit5

我刚刚意识到(将遗留代码从JUnit 4迁移到JUnit 5时)我们的一些测试方法没有执行,因为它们没有@Test注释。他们没有它,因为它们覆盖了抽象超类中的方法(注释存在的地方)。

我可以通过向每个方法添加@Test来轻松解决此问题。但我想知道这是否是预期的行为。它从JUnit 4变为5但我无法在official JUnit5 User Guide或其他任何地方找到任何相关信息。

根据this question,注释通常不会被继承。但似乎在新的JUnit版本中故意改变了这一点。 (或者我错过了什么?)

抽象测试类

import org.junit.jupiter.api.Test;

abstract class AbstractJUnit5Test {

  @Test
  void generalTest() {
    System.out.println("This is a test in the abstract class");
  }

  @Test
  abstract void concreteTest();
}

具体测试类

import org.junit.jupiter.api.Test;

class ConcreteJUnt5Test extends AbstractJUnit5Test {

  // only gets executed with an additional @Test annotation:
  @Override
  void concreteTest() { 
    System.out.println("This is from the concrete test method.");
  }
}

2 个答案:

答案 0 :(得分:7)

这是JUnit 4和JUnit Jupiter之间的无意识差异。

详情请见https://github.com/junit-team/junit5/issues/960

编辑:经过进一步调查后,似乎JUnit 4的这种(方便)行为实际上是无意的。请参阅Sam在https://github.com/junit-team/junit5/issues/960#issuecomment-316114648

的最新评论

答案 1 :(得分:0)

我想你正试图在你的测试方法之间建立某种关系。尝试使用@Nested
You can find a sample here