从 JUnit4 迁移到 JUnit5 时,我发现 JUnit4 和 JUnit5 的行为发生了变化,并想检查该变化是否是 JUnit4 或 JUnit5 中的错误以及如何正确执行。
让我们假设以下结构:
一个基类
public class BaseTestClass {
@Before
public void setUp(){
System.out.println("Base Test Class");
}
}
继承该基类的另一个类
public class InheritsFromBase extends BaseTestClass {
@Override
public void setUp() {
System.out.println("I inherit from base");
super.setUp();
}
}
还有实际的测试课
public class ActualTests extends InheritsFromBase {
@Test
public void myTest(){
Assert.assertTrue(true);
}
}
如果我在 JUnit 4 中运行
myTest()
,则调用 setUp()
和 BaseTestClass
的 InheritsFromBase
方法。
将此代码迁移到 JUnit5 后,不再调用
setUp()
方法。我必须在 @BeforeEach
上手动添加 InheritsFromBase
注释。
产生以下课程:
public class BaseTestClass {
@BeforeEach
public void setUp(){
System.out.println("Base Test Class");
}
}
public class InheritsFromBase extends BaseTestClass {
@Override
@BeforeEach
public void setUp() {
System.out.println("I inherit from base");
super.setUp();
}
}
public class ActualTests extends InheritsFromBase {
@Test
public void myTest(){
Assertions.assertTrue(true);
}
}
所以我的问题:JUnit4 中的行为正确还是 JUnit5 中的行为正确?
JUnit 5 的实际行为符合 @BeforeEach javadoc 的预期:
传承
方法从超类继承,只要它们 没有被覆盖。@BeforeEach
您重写了
setup()
类中包含 @BeforeEach
的 InheritsFromBase
方法。@Before
javadoc 没有说明任何特殊性和继承能力。要在 JUnit 5 中获得相同的行为,您应该执行与 JUni4 相同的操作:删除超类中的
@BeforeEach
并仅将其添加到子类中。
public class BaseTestClass {
public void setUp() {
System.out.println("Base Test Class");
}
}
public class InheritsFromBase extends BaseTestClass {
@Override
@BeforeEach
public void setUp() {
System.out.println("I inherit from base");
super.setUp();
}
}
当我执行测试时,它会生成输出:
我从base继承
基础测试类