代码之家  ›  专栏  ›  技术社区  ›  ChristophE

@Before/@beforeach继承行为更改JUnit4/JUnit5

  •  14
  • ChristophE  · 技术社区  · 6 年前

    从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);
        }
    }
    

    如果我跑步 myTest() 在JUnit 4中 setUp() 两者的方法, BaseTestClass InheritsFromBase 被调用。

    将此代码迁移到JUnit5后 安装程序() 不再调用方法。我不得不手动添加 @BeforeEach 批注位于 继承自基 .

    导致以下类别:

    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 回复  |  直到 6 年前
        1
  •  23
  •   davidxxx    6 年前

    JUnit 5的实际行为应为 @BeforeEach javadoc 国家:

    遗产

    @BeforeEach 方法继承自超类,只要它们 不会被覆盖。

    您覆盖了 setup() 包含的方法 @在每个之前 InheritsFromBase
    因此,它不再是继承的。

    对于JUnit 4 @Before javadoc 没有说明任何特殊性和继承能力。
    因此,您应该将实际行为视为“正常”,但没有记录在案。

    要获得与JUnit 5相同的行为,应该执行与JUnit4相反的操作:删除 @在每个之前 只在子类中添加它。

    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

    基本测试等级