@Before/@BeforeEach继承行为改变JUnit4 / JUnit5

问题描述 投票:0回答:1

从 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 中的行为正确?

java junit4 junit5
1个回答
31
投票

JUnit 5 的实际行为符合 @BeforeEach javadoc 的预期:

传承

@BeforeEach
方法从超类继承,只要它们 没有被覆盖。

您重写了

setup()
类中包含
@BeforeEach
InheritsFromBase
方法。
所以它不再被继承。

对于 JUnit 4,

@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继承

基础测试类

© www.soinside.com 2019 - 2024. All rights reserved.