[英]How to get rid of TemporaryFolder rule in Junit5
我正在將單元測試從 Junit4 遷移到 Junit5。 在測試中,我使用來自 Junit4 API 的TemporaryFolder
規則。 為了保持測試正常工作,我添加了@EnableRuleMigrationSupport
注釋:
@EnableRuleMigrationSupport
public final class SomeTest {
@Rule
public final TemporaryFolder tmp = new TemporaryFolder();
// tests ...
}
據我了解,在 Junit5 中我需要使用extensions而不是rules ,但在 Junit5 擴展中我找不到任何替代TemporaryFolder
的東西。 它存在嗎? 如何正確用擴展名替換TemporaryFolder
規則?
您可以使用JUnit 5 用戶指南的 §2.20.1 中描述的@TempDir
注釋 (JUnit 5.4+)。 從用戶指南(強調我的):
內置的
TempDirectory
擴展用於為單個測試或測試類中的所有測試創建和清理臨時目錄。 默認情況下已注冊。 要使用它,請使用@TempDir
注釋java.nio.file.Path
或java.io.File
類型的非私有字段,或添加使用@TempDir
注釋的java.nio.file.Path
或java.io.File
類型的參數@TempDir
到生命周期方法或測試方法。
注意:此擴展是在5.4
版中添加的,目前(從5.8.2
開始)是實驗性的。
使用實例字段的示例:
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import java.nio.file.Path; // or use java.io.File
class SomeTests {
@TempDir
Path directory; // may be private since 5.8
}
使用測試方法參數的示例:
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import java.nio.file.Path; // or use java.io.File
class SomeTests {
@Test
void testFoo(@TempDir Path directory) {
// do test...
}
}
注意:不支持構造函數參數。
@TempDir
的 Javadoc 中描述了創建和刪除目錄的時間(來自 JUnit 5.8.2 的文檔引用):
創建
僅當測試類中的字段或生命周期方法或測試方法中的參數使用
@TempDir
注釋時,才會創建臨時目錄。 如果字段類型或參數類型既不是Path
也不是File
,或者如果無法創建臨時目錄,則會酌情拋出ExtensionConfigurationException
或ParameterResolutionException
。 此外,對於使用@TempDir
注釋的構造函數參數,將引發ParameterResolutionException
。范圍
默認情況下,為
@TempDir
注釋的每個聲明創建一個單獨的臨時目錄。 如果要在測試類中的所有測試之間共享臨時目錄,則應在static
字段或@BeforeAll
方法的參數上聲明注釋。舊行為
您可以通過將
junit.jupiter.tempdir.scope
配置參數設置為per_context
來恢復使用單個臨時目錄的舊行為。 在這種情況下,臨時目錄的范圍取決於在執行測試類時遇到第一個@TempDir
注釋的位置。 當注釋出現在static
字段或@BeforeAll
方法的參數上時,臨時目錄將由類中的所有測試共享。 否則——例如,當@TempDir
僅用於實例字段或 test、@BeforeEach
或@AfterEach
方法中的參數時——每個測試將使用自己的臨時目錄。刪除
當到達臨時目錄范圍的末尾時,即當測試方法或類完成執行時,JUnit 將嘗試遞歸刪除臨時目錄中的所有文件和目錄,最后是臨時目錄本身。 如果刪除文件或目錄失敗,將拋出
IOException
導致測試或測試類失敗。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.