@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() 然后调用 BaseTestClassInheritsFromBasesetUp() 方法。

将此代码迁移到 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.
中覆盖了包含 @BeforeEachsetup() 方法 所以它不再被继承了。

对于 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