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 的 个实例 ,这对您不起作用。相反,您需要使用 @MethodSource
2.
@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
,如果您需要的话。
我想创建一个 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 的 个实例 ,这对您不起作用。相反,您需要使用 @MethodSource
2.
@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
,如果您需要的话。