@Before/@BeforeEach遗传行为改变 JUnit4 / JUnit5

2022-09-04 00:52:03

从 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()BaseTestClassInheritsFromBase

将此代码迁移到 JUnit5 后,将不再调用这些方法。我不得不手动添加注释。setUp()@BeforeEachInheritsFromBase

生成以下类:

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中?


答案 1

JUnit 5 的实际行为是预期的,正如 javadoc @BeforeEach所述:

遗产

@BeforeEach方法从超类继承,只要它们不被重写。

重写类中包含的方法。
因此不再继承该方法。setup()@BeforeEachInheritsFromBase

对于 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();
    }
}

当我执行测试时,它产生作为输出:

我从基地继承

基本测试类


答案 2

推荐