【问题标题】:How to get rid of TemporaryFolder rule in Junit5如何摆脱 Junit5 中的 TemporaryFolder 规则
【发布时间】:2019-10-30 00:27:52
【问题描述】:

我正在将单元测试从 Junit4 迁移到 Junit5。在测试中,我使用来自 Junit4 API 的 TemporaryFolder rule。为了保持测试正常进行,我添加了@EnableRuleMigrationSupport 注释:

@EnableRuleMigrationSupport
public final class SomeTest {

    @Rule
    public final TemporaryFolder tmp = new TemporaryFolder();

   // tests ...
}

据我了解,在 Junit5 中我需要使用 extensions 而不是 rules,但在 Junit5 扩展中我找不到任何替代 TemporaryFolder 的方法。它存在吗?如何正确用扩展名替换TemporaryFolder规则?

【问题讨论】:

    标签: java junit junit5


    【解决方案1】:

    您可以使用§2.20.1 of the JUnit 5 User Guide 中描述的@TempDir 注释(JUnit 5.4+)。来自用户指南(强调我的):

    内置的TempDirectory 扩展用于为单个测试或测试类中的所有测试创建和清理临时目录。 默认注册。要使用它,请使用@TempDir注释java.nio.file.Pathjava.io.File类型的非私有字段或添加java.nio.file.Pathjava.io.File类型的参数注释将@TempDir 添加到生命周期方法或测试方法。

    注意:此扩展是在 5.4 版本中添加的,目前(截至 5.7.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; // must be non-private
    
    }
    

    测试方法参数使用示例:

    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...
        }
    
    }
    

    注意:不支持构造函数参数。

    目录的创建和删除时间在the Javadoc of @TempDir中描述:

    临时目录创建

    仅当测试类中的字段或生命周期方法或测试方法中的参数使用@TempDir注解时才会创建临时目录。如果字段类型或参数类型既不是Path 也不是File 或者如果无法创建临时目录,则会酌情抛出ExtensionConfigurationExceptionParameterResolutionException。此外,对于使用@TempDir 注释的构造函数参数,将抛出ParameterResolutionException

    临时目录范围

    临时目录的范围取决于在执行测试类时遇到第一个@TempDir 注解的位置。当注释出现在static 字段或@BeforeAll 方法的参数上时,临时目录将由类中的所有测试共享。否则 - 例如,当 @TempDir 仅用于实例字段或测试中的参数时,@BeforeEach@AfterEach 方法 - 每个测试都将使用自己的临时目录。

    临时目录删除

    当到达临时目录范围的末尾时,即当测试方法或类完成执行时,JUnit 将尝试递归删除临时目录中的所有文件和目录,最后是临时目录本身。如果文件或目录删除失败,将抛出IOException,这将导致测试或测试类失败。

    【讨论】:

    猜你喜欢
    • 2017-04-12
    • 2023-04-01
    • 2011-09-25
    • 2019-04-18
    • 2022-11-04
    • 2020-05-13
    • 1970-01-01
    • 2014-01-28
    • 2013-10-31
    相关资源
    最近更新 更多