[英]@Before/@BeforeEach inheritance behaviour change JUnit4 / JUnit5
從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()
, BaseTestClass
調用BaseTestClass
和InheritsFromBase
的setUp()
方法。
在將此代碼遷移到JUnit5之后,不再調用setUp()
方法。 我必須在InheritsFromBase
上手動添加@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中的行為正確?
預期JUnit 5的實際行為是@BeforeEach javadoc指出的:
遺產
@BeforeEach
方法是從超類繼承的,只要它們不被覆蓋即可。
您重寫InheritsFromBase
類中包含@BeforeEach
的setup()
方法。
因此,它不再繼承。
對於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();
}
}
當我執行測試時,它生成為輸出:
我從基地繼承
基礎測試課
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.