JUnit 5 測試問題 throws java.lang.Exception’ must be static unless the test class is annotated with @TestInstance(Lifecycle.PER_CLASS)


在運行測試的時候提示下面的錯誤:

org.junit.platform.commons.JUnitException: @BeforeAll method 'protected void com.ossez.edtestbank.tests.QuestionTest.setUp() throws java.lang.Exception' must be static unless the test class is annotated with @TestInstance(Lifecycle.PER_CLASS).

測試實例生命周期

為了允許隔離執行單個的測試方法,並避免由於可變測試實例狀態而產生的意外副作用,JUnit在執行每個測試方法之前創建每個測試類的新實例(請參閱下面的講解,何為測試方法)。這個”per-method”測試實例生命周期是 JUnit Jupiter 中的默認行為,類似於JUnit以前的所有版本。

如果您希望JUnit Jupiter在同一個測試實例上執行所有測試方法,只需使用 @TestInstance(Lifecycle.PER_CLASS) 對您的測試類進行注解即可。當使用這種模式時,每個測試類將創建一個新的測試實例。因此,如果您的測試方法依賴於存儲在實例變量中的狀態,則可能需要在 @BeforeEach 或 @AfterEach 方法中重置該狀態。

“per-class”模式比默認的”per-method”模式有一些額外的好處。具體來說,使用”per-class”模式,可以在非靜態方法和接口默認方法上聲明 @BeforeAll 和 @AfterAll(否則@BeforeAll與@AfterAll必須是注解在static的方法上才能生效) 。因此,”per-class”模式也可以在 @Nested 測試類中使用 @BeforeAll 和 @AfterAll 方法。

如果使用Kotlin編程語言編寫測試,則可能會發現,通過切換到”per-class”測試實例生命周期模式,可以更輕松地實現 @BeforeAll 和 @AfterAll 方法。

使用靜態方法

因為下面的方法:

	@BeforeAll protected void setUp() throws Exception { Factory.beginTransaction(); } 

沒有使用靜態方法,所以提示上面的錯誤,你可用使用靜態方法后運行。

你的測試方法應該不會提示錯誤。

Lifecycle.PER_METHOD

在方法中使用

@TestInstance(TestInstance.Lifecycle.PER_METHOD)

來定義測試。

 

 

使用上面的方法就可以讓你的測試執行了。

 

https://www.ossez.com/t/junit-5-throws-java-lang-exception-must-be-static-unless-the-test-class-is-annotated-with-testinstance-lifecycle-per-class/489


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM