JUnit @ParametrizedTest Class 对象作为值源?

JUnit @ParametrizedTest Class Objects as Value Source?

我想创建一个 ParametrizedTest 来同时测试一堆不同的 AI,确保它们的计算不会花费太长时间。但是,我无法在 ValueSource 中创建新对象,所以我不确定如何继续。

问题是我需要将常量值传递给 ValueSource,这是我卡住的地方。 如何使我的对象保持不变?


 @ParameterizedTest
  @ValueSource(ais = {new AdvancedAI(), new blabla})
  public void moveCalculatedInTimeBy(AI TestAI) {
    long startTime = System.currentTimeMillis();
    Turn turn = Turn.initialTurn();
    Move calculatedMove = TestAI.calculateMove(Optional.empty(), turn);
    long endTime = System.currentTimeMillis() - startTime;
    assertTrue(endTime <= 8000);
  }

使用@ValueSource 用于简单参数,即可以设置为注释元素值的类型。换句话说,基元、字符串和 classes1。由于您想提供 class 的 个实例 ,这对您不起作用。相反,您需要使用 @MethodSource2.

@ParameterizedTest
@MethodSource("testAiProvider")
void moveCalculatedInTimeBy(AI testAI) {
  // perform test...
}

static List<AI> testAiProvider() {
  // return List of test AI instances
}

查看 user guide 和 Javadoc 了解更多信息,例如工厂方法允许哪些 return 类型。


1. 枚举常量也可以用在注解中,但是你不能做一个通用的枚举注解元素。这就是为什么 JUnit 5 也有 @EnumSource.

2。 您也可以直接使用 @ArgumentsSource,这样您就可以定义一个 ArgumentsProvider,如果您需要的话。