我正在使用 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 的参数解析器发生冲突的正确方法是什么?
将
@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
}
}