有没有办法将 @RepeatedTest
注释与 @TestTemplate
一起使用?
目标是为每种类型的 Dependency
运行多次测试,它由 Extension
类注入(inject)。
@TestTemplate
@RepeatedTest(100)
@Timeout(1)
void test(final Dependency dep) throws Exception {
....
}
最佳答案
注意:下面的示例提供了使用自定义 Dependency 类实现的自定义 @TestTemplate 的实现
考虑一下:
import org.junit.jupiter.api.TestTemplate;
import org.junit.jupiter.api.Timeout;
import org.junit.jupiter.api.extension.*;
import java.util.Collections;
import java.util.List;
import java.util.stream.IntStream;
import java.util.stream.Stream;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class RepeatedParametrizedTest {
@TestTemplate
@ExtendWith(MyTemplate.class)
@Timeout(1)
void test(final Dependency dep) {
assertEquals(true, true);
}
}
class Dependency {
private final String name;
public Dependency(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public String toString() {
return name;
}
}
class MyTemplate implements TestTemplateInvocationContextProvider {
@Override
public boolean supportsTestTemplate(ExtensionContext context) {
return true;
}
@Override
public Stream<TestTemplateInvocationContext> provideTestTemplateInvocationContexts(ExtensionContext context) {
// here goes your implementation of all possible Dependency objects wrapped in invocationContext()
return IntStream.range(0, 100)
.flatMap(n -> IntStream.range(1, 10))
.mapToObj(n -> invocationContext(new Dependency("dependency" + n)));
}
private TestTemplateInvocationContext invocationContext(Dependency dependency) {
return new TestTemplateInvocationContext() {
@Override
public String getDisplayName(int invocationIndex) {
return dependency.getName();
}
@Override
public List<Extension> getAdditionalExtensions() {
return Collections.singletonList(new ParameterResolver() {
@Override
public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) {
return parameterContext.getParameter().getType().equals(Dependency.class);
}
@Override
public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) {
return dependency;
}
});
}
};
}
}
对于 10 * 10 个实例会产生:
关于java - 如何重复参数化的 Junit 5 测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66139122/