Java 为什么JUnit5测试不从抽象类继承@Test注释?
我刚刚意识到(在将遗留代码从JUnit4迁移到JUnit5时),我们的一些测试方法没有执行,因为它们没有Java 为什么JUnit5测试不从抽象类继承@Test注释?,java,junit,junit5,Java,Junit,Junit5,我刚刚意识到(在将遗留代码从JUnit4迁移到JUnit5时),我们的一些测试方法没有执行,因为它们没有@test注释。它们没有,因为它们重写了抽象超类(存在注释的地方)中的方法 我可以通过在每个方法中添加@Test来轻松解决这个问题。但我想知道这是否是故意的行为。它从JUnit4更改为5,但我在中或其他任何地方都找不到关于它的任何信息 根据,注释通常不是继承的。但在新的JUnit版本中,这似乎是故意更改的。(还是我遗漏了什么?) 抽象测试类 混凝土试验班 我想您正在尝试在测试方法之间建立某种关
@test
注释。它们没有,因为它们重写了抽象超类(存在注释的地方)中的方法
我可以通过在每个方法中添加@Test
来轻松解决这个问题。但我想知道这是否是故意的行为。它从JUnit4更改为5,但我在中或其他任何地方都找不到关于它的任何信息
根据,注释通常不是继承的。但在新的JUnit版本中,这似乎是故意更改的。(还是我遗漏了什么?)
抽象测试类
混凝土试验班
我想您正在尝试在测试方法之间建立某种关系。如果可以使用
@Nested
,请尝试这是JUnit 4和JUnit Jupiter之间无意的区别 详情请参阅
编辑:经过进一步调查,JUnit4中的这种(方便的)行为实际上是无意的。参见Sam在上的最新评论,我真的不知道这将如何帮助创建与抽象超类类似的设置。至少在我的用例中,目标是在每个测试子类必须实现的
@beforeach
和@AfterEach
方法和抽象方法中拥有一个带有公共夹具代码的超类。(因此,来自同一层次结构的许多类似类可以以统一的方式进行测试。)不一定是好的测试设计,但到目前为止,它仍然有效。
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.");
}
}