如何在 JUnit 5 @ParameterizedTest 中使用 @TempDir 为每个测试创建单独的临时目录?

问题描述 投票:0回答:1

我正在使用 JUnit 5 的

@ParameterizedTest
注释来运行具有不同输入的测试,并且我想为每个测试生成一个单独的临时目录。这是我的代码的样子:

class MyTestClass {

    static Stream<Arguments> syntax() {
        return Stream.of(
            Arguments.of("grammars/Simple.g4", "expr"),
            Arguments.of("grammars/Arithmetic.g4", "prog")
        );
    }

    @ParameterizedTest
    @MethodSource("syntax")
    void checksSyntax(
        @TempDir final Path temp,  // Temporary directory created by JUnit
        final String name,
        final String rule
    ) {     
        // some testing logic   
    }
}

方法

syntax()
为测试提供了不同的输入,我想确保每个测试运行都有自己的临时目录。

但是,当我运行代码时,出现以下异常:

org.junit.jupiter.api.extension.ParameterResolutionException: 
Discovered multiple competing ParameterResolvers for parameter [java.nio.file.Path arg0] 
in method [void checksSyntax(java.nio.file.Path,java.lang.String,java.lang.String)]:
org.junit.jupiter.engine.extension.TempDirectory@4ae3c1cd,
org.junit.jupiter.params.ParameterizedTestParameterResolver@29f69090

我尝试通过从方法源传递临时目录来修改代码:

static Stream<Arguments> syntax(@TempDir final Path temp) {
    return Stream.of(
        Arguments.of(temp, "grammars/Simple.g4", "expr"),
        Arguments.of(temp, "grammars/Arithmetic.g4", "prog")
    );
}

但是,这会导致所有测试用例使用相同的临时目录,这不是我想要的。我需要为每个测试用例一个单独的临时目录。

问题:

如何确保为 JUnit 5 中的每个测试用例创建一个新的临时目录

@ParameterizedTest
?将
@TempDir
与参数化测试集成而不与 JUnit 的参数解析器发生冲突的正确方法是什么?

java unit-testing junit junit5 parametrized-testing
1个回答
0
投票

解决方法

@TempDir
参数放在最后。

我发现了一个简单的解决方法,只需进行微小的调整即可达到预期的结果。该问题似乎是由于测试方法中参数的顺序而引起的。通过将参数顺序从

Path
String
String
更改为
String
String
Path
(其中
Path
代表临时目录),JUnit 将不再抛出异常。 将
Path
参数放在最后可确保该方法按预期工作。这可能是因为 JUnit 将
@TempDir
参数放置在参数列表末尾时以不同的方式处理。

这是一个工作示例:

class MyTestClass {

    static Stream<Arguments> syntax() {
        return Stream.of(
            Arguments.of("grammars/Simple.g4", "expr"),
            Arguments.of("grammars/Arithmetic.g4", "prog")
        );
    }

    @ParameterizedTest
    @MethodSource("syntax")
    void checksSyntax(
        final String name,
        final String rule
        @TempDir final Path temp,  // Temporary directory created by JUnit
    ) {     
        // some testing logic   
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.