2017-12-27 174 views
0

這兩個註釋都用來表示在當前測試類的每個Test方法之前應該執行帶註釋的方法。BeforeClass(Junit 4)和BeforeEach(Junit5)之間的區別

那麼我們爲什麼要將註釋從更改爲@BeforeClass - Junit 4至@BeforeEach Junit 5

還有什麼額外的,已添加在junit 5,我失蹤了?

其他註釋的類似情況。

+1

不,這不是BeforeClass的目的。閱讀javadoc。但名稱已經改變,因爲......他們認爲新名稱更好。由於它是一個新的,不兼容的版本,爲什麼不更改名稱? –

+4

'@ Before'被重命名爲'@ BeforeEach'(並且'@ BeforeClass'被重命名爲'@ BeforeAll')。正如你已經提到的那樣,它們是「在每種測試方法之前執行的」。所以這是一個很好的新名字。 –

+0

感謝您檢查此內容。 BeforeClass也用於在類中的任何測試方法之前運行一次,因此兩者都是相同的。這是如果他們剛剛改變了名字。我想知道他們是否在新註釋中添加了任何額外的東西 – Niraj

回答

1

添加的主要功能是對Test Instance Lifecycle進行更細粒度的控制,例如通過@TestInstance註釋。我認爲這是更改舊的@Before@BeforeClass註釋名稱的原因之一。

舊(JUnit4)@Before和新(JUnit5)@BeforeEach是在它們被執行類似重新之前每@Test方法在測試類。所以如果你的班級有10種測試方法,@BeforeEach方法會執行10次。

老(JUnit4)@BeforeClass和新(JUnit5)@BeforeAll很相似,它們都只是執行一次,在任何類中的測試。所以即使你的班級有10次測試,@BeforeAll方法也只執行一次。

@BeforeClass重命名爲@BeforeEach的問題中提出的建議因此是不正確

有關更多信息,另請參閱this question關於@Before,@BeforeClass,@BeforeEach和@BeforeAll之間的區別。

2

有一些相關的變化需要先用@TestInstance(Lifecycle.PER_CLASS)對測試類進行註釋。這將爲每個測試類而不是每個方法創建一個新的測試實例。

因此,您可以將@BeforeAll@AfterAll用於非靜態方法以及接口默認方法。它還允許您在@Nested測試類中使用@BeforeAll@AfterAll

如果您使用Lifecycle.PER_CLASS您必須記住,如果您的測試依賴於存儲在實例變量中的狀態,則您可能必須重置@BeforeEach@AfterEach中的狀態。

相關問題