java - 如何重复参数化的 Junit 5 测试?

标签 java junit junit5

有没有办法将 @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 个实例会产生:

IntelliJ IDEA test output

关于java - 如何重复参数化的 Junit 5 测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66139122/

相关文章:

intellij-idea - IntelliJ 不会自动完成 JUnit 5 Jupiter 类

java - 在 xtext 环境中将 JUnit4 升级到 JUnit5

java - DeleteByName 方法不适用于 RandomAccessFile

java - 指定 Java 通信库的位置

java - 如何在 Java Junit TestCase 中设置 session 变量

java - JUnit 测试意外行为

java - 用于 JUnit 测试的 Mockup JNDI 数据源

java - Flutter:插件需要 Android SDK 版本 31 但它设置为 31?

java - 如何检查给定对象是JSON字符串中的对象还是数组

java - 确定运行 JUnit 测试时变量未重置为默认值的原因