【问题标题】:Why do JUnit 5 tests not inherit @Test annotation from abstract classes?为什么 JUnit 5 测试不从抽象类继承 @Test 注释?
【发布时间】:2017-12-23 01:18:23
【问题描述】:

我刚刚意识到(在将遗留代码从 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.");
  }
}

【问题讨论】:

    标签: java junit junit5


    【解决方案1】:

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

    【讨论】:

    • 我真的不明白这将如何帮助创建与抽象超类类似的设置。至少在我的用例中,目标是在@BeforeEach@AfterEach 方法和必须由每个测试子类实现的抽象方法中拥有一个具有公共夹具代码的超类。 (以便可以以统一的方式测试来自同一层次结构的许多相似类。)不一定是好的测试设计,但到目前为止它确实有效。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-02-19
      • 2020-05-31
      • 1970-01-01
      • 1970-01-01
      • 2014-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多