在運行測試的時候提示下面的錯誤:
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)
來定義測試。
使用上面的方法就可以讓你的測試執行了。