@Before/@BeforeEach 继承行为改变 JUnit4 / JUnit5
@Before/@BeforeEach inheritance behaviour change JUnit4 / JUnit5
从 JUnit4 迁移到 JUnit5 时,我发现 JUnit4 和 JUnit5 的行为发生了变化,想检查该变化是否是 JUnit4 或 JUnit5 中的错误以及如何正确执行。
让我们假设以下结构:
一个基地class
public class BaseTestClass {
@Before
public void setUp(){
System.out.println("Base Test Class");
}
}
另一个class继承自这个基础class
public class InheritsFromBase extends BaseTestClass {
@Override
public void setUp() {
System.out.println("I inherit from base");
super.setUp();
}
}
和实际测试class
public class ActualTests extends InheritsFromBase {
@Test
public void myTest(){
Assert.assertTrue(true);
}
}
如果我在 JUnit 4 中 运行 myTest()
然后调用 BaseTestClass
和 InheritsFromBase
的 setUp()
方法。
将此代码迁移到 JUnit5 后,setUp()
方法不再被调用。我不得不在 InheritsFromBase
.
上手动添加 @BeforeEach
注释
导致以下 classes:
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 所述:
Inheritance
@BeforeEach
methods are inherited from superclasses as long as they
are not overridden.
您在 InheritsFromBase
class.
中覆盖了包含 @BeforeEach
的 setup()
方法
所以它不再被继承了。
对于 JUnit 4,@Before
javadoc 没有说明任何特殊性和继承能力。
因此,您应该将实际行为视为 "normal" 但没有记录。
要获得与 JUnit 5 相同的行为,您应该执行与 JUni4 相同的操作:删除超级 class 中的 @BeforeEach
并仅将其添加到子 class 中].
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();
}
}
当我执行测试时,它产生输出:
I inherit from base
Base Test Class
从 JUnit4 迁移到 JUnit5 时,我发现 JUnit4 和 JUnit5 的行为发生了变化,想检查该变化是否是 JUnit4 或 JUnit5 中的错误以及如何正确执行。
让我们假设以下结构:
一个基地class
public class BaseTestClass {
@Before
public void setUp(){
System.out.println("Base Test Class");
}
}
另一个class继承自这个基础class
public class InheritsFromBase extends BaseTestClass {
@Override
public void setUp() {
System.out.println("I inherit from base");
super.setUp();
}
}
和实际测试class
public class ActualTests extends InheritsFromBase {
@Test
public void myTest(){
Assert.assertTrue(true);
}
}
如果我在 JUnit 4 中 运行 myTest()
然后调用 BaseTestClass
和 InheritsFromBase
的 setUp()
方法。
将此代码迁移到 JUnit5 后,setUp()
方法不再被调用。我不得不在 InheritsFromBase
.
@BeforeEach
注释
导致以下 classes:
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 所述:
Inheritance
@BeforeEach
methods are inherited from superclasses as long as they are not overridden.
您在 InheritsFromBase
class.
中覆盖了包含 @BeforeEach
的 setup()
方法
所以它不再被继承了。
对于 JUnit 4,@Before
javadoc 没有说明任何特殊性和继承能力。
因此,您应该将实际行为视为 "normal" 但没有记录。
要获得与 JUnit 5 相同的行为,您应该执行与 JUni4 相同的操作:删除超级 class 中的 @BeforeEach
并仅将其添加到子 class 中].
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();
}
}
当我执行测试时,它产生输出:
I inherit from base
Base Test Class