JUnit 5中的ExternalResource和TemporaryFolder的等价物是什么?

Thu*_*rge 13 java junit temporary-files junit5

根据JUnit 5用户指南,JUnit Jupiter为某些JUnit 4规则提供向后兼容性,以帮助迁移.

如上所述,JUnit Jupiter本身不支持也不支持JUnit 4规则.然而,JUnit团队意识到许多组织,特别是大型组织,可能拥有大型JUnit 4代码库,包括自定义规则.为了服务这些组织并实现渐进式迁移路径,JUnit团队决定在JUnit Jupiter中逐字支持一系列JUnit 4规则.

该指南继续说其中一个规则是ExternalResource,它是TemporaryFolder的父级.

但是,遗憾的是,该指南没有继续说明迁移路径是什么,或者对于那些编写新JUnit 5测试的人来说等价.那么我们应该使用什么?

Ada*_*dam 6

有关JUnit5的TemporaryFolderExtension作者的有趣文章

他在github上的代码回购

JUnit5.0.0现在已经发布了,所以我们希望他们把注意力转移到让生产准备好的实验性产品上.

同时,似乎TemporaryFolder规则仍然适用于JUnit5 文档

用这个:

@EnableRuleMigrationSupport
public class MyJUnit5Test {
Run Code Online (Sandbox Code Playgroud)

还有这个:

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-migrationsupport</artifactId>
    <version>5.0.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)


sim*_*mat 6

据我所知,ExternalResource在 JUnit5 中不可能有一对一的映射。这些概念不适合。在 JUnit4 中,ExternalResource基本上为您提供了一个before和一个after回调,但在规则中,您无法控制什么beforeafter实际意味着什么。您可以将它与@Rule或 一起使用@ClassRule

在 JUnit5 中,扩展被定义为挂钩特定的扩展点,因此“何时”被很好地定义。

概念上的另一个区别是,您可以在 JUnit4 规则中具有状态,但您的 JUnit5 扩展不应具有任何状态。相反,所有状态都应该转到执行上下文

尽管如此,这是我提出的一个选项,其中beforeafter每种测试方法相关:

public abstract class ExternalResourceExtension 
  implements BeforeTestExecutionCallback, AfterTestExecutionCallback {
    @Override
    public void beforeTestExecution(ExtensionContext context) throws Exception {
        before(context);
    }

    @Override
    public void afterTestExecution(ExtensionContext context) throws Exception {
        after(context);
    }

    protected abstract void before(ExtensionContext context);

    protected abstract void after(ExtensionContext context);
}
Run Code Online (Sandbox Code Playgroud)


Raf*_*iec 5

JUnit 5.4 带有一个内置扩展来处理测试中的临时目录。

@org.junit.jupiter.api.io.TempDir可以使用注解来注解类字段或生命周期中的参数(例如@BeforeEach)或类型为Fileor 的测试方法Path

import org.junit.jupiter.api.io.TempDir;

@Test
void writesContentToFile(@TempDir Path tempDir) throws IOException {
    // arrange
    Path output = tempDir
            .resolve("output.txt");

    // act
    fileWriter.writeTo(output.toString(), "test");

    // assert
    assertAll(
            () -> assertTrue(Files.exists(output)),
            () -> assertLinesMatch(List.of("test"), Files.readAllLines(output))
    );
}
Run Code Online (Sandbox Code Playgroud)

您可以在我的博客文章中阅读更多相关内容,您会在其中找到更多关于使用此内置扩展的示例:https : //blog.codeleak.pl/2019/03/temporary-directories-in-junit-5-测试.html