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

2022-09-04 22:04:24

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

我可以通过向每个方法添加来轻松解决此问题。但我想知道这是否是预期的行为。它从JUnit 4更改为5,但我在官方JUnit5用户指南或其他任何地方都找不到有关它的任何信息。@Test

根据这个问题,注释通常不会被继承。但似乎在新的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.");
  }
}

答案 1

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

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

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


答案 2

我想你正试图在你的测试方法之间建立某种关系。如果可以使用 ,请尝试。
您可以在此处找到示例@Nested


推荐