gpt4 book ai didi

java - 以更智能的方式在 Junit 5(或其他测试 Java 库)中使用数组参数化

转载 作者:IT老高 更新时间:2023-10-28 20:53:45 25 4
gpt4 key购买 nike

我正在尝试参数化这个测试:

@Test
public void reverseQuote(double[] qsp) throws Exception {
...}

在我看来,它不存在一些快速的方法来初始化数组 qsp,例如 ValueSource:

@ParameterizedTest
@ValueSource(ints = { 1, 2, 3 })
void testWithValueSource(int argument) {
assertNotNull(argument);
}

我的目标是执行 @ValueSource(doublesArray = {new double[]{1.0, 2.0, 3.0}}) 之类的操作(现在返回错误)。不存在任何允许类似的东西吗? Other answers似乎只建议使用详细的方法,例如使用 @MethodSource@ConvertWith

我也接受实现其他测试库的答案。

最佳答案

好的,这将是一个奇怪的答案,但它确实有效,而且做起来很有趣。

第一件事:你的方式是不可能的。不是因为 JUnit 或任何相关的 API,而是因为 Java - valid annotation type elements (注解参数只能是原始的、字符串、类、枚举、其他注解和所有这些的数组)。

第二件事:我们可以绕过第一件事。检查这个:

@ArraySources(
arrays = {
@ArraySource(array = {1, 2, 3}),
@ArraySource(array = {4, 5, 6}),
@ArraySource(array = {7, 8, 9})
}
)

正如它所说,注解可以有其他注解作为参数,以及这些注解的数组,所以我们在这里使用这两个规则。

第三件事:这有什么帮助?我们可以添加自己的注解 + 参数提供者,JUnit 5 可以通过这种方式进行扩展。

两个注释:

@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@ArgumentsSource(ArrayArgumentsProvider.class)
public @interface ArraySources {
ArraySource[] arrays();
}

@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ArraySource {
int[] array() default {};
}

基于注解的参数提供者:

public class ArrayArgumentsProvider implements ArgumentsProvider, AnnotationConsumer<ArraySources> {
private List<int[]> arguments;

public void accept(ArraySources source) {
List<ArraySource> arrays = Arrays.asList(source.arrays());

this.arguments = arrays.stream().map(ArraySource::array).collect(Collectors.toList());
}

public Stream<? extends Arguments> provideArguments(ExtensionContext context) {
return this.arguments.stream().map(Arguments::of);
}
}

以及使用这些的最终测试:

public class ArraySourcesTest {
@ParameterizedTest
@ArraySources(
arrays = {
@ArraySource(array = {1, 2, 3}),
@ArraySource(array = {4, 5, 6}),
@ArraySource(array = {7, 8, 9})
}
)
void example(int[] array) {
System.out.println(Arrays.toString(array));
System.out.println("Test Over");
}
}

/* Output
[1, 2, 3]
Test Over
[4, 5, 6]
Test Over
[7, 8, 9]
Test Over
*/

你提到 @MethodSource 很复杂,好吧,所以我认为我在这件事上失败了,但它有效。它可以明显地简化和增强(比如将注释参数命名为默认值 - 值 - 我只是为了 int 来展示这个想法)。不确定您是否可以使用现有功能(ArgumentsProviderArgumentSources)实现相同的功能,但这看起来更具体(您知道您正在使用数组)并显示了扩展的可能性JUnit5,在其他情况下可能有用。

关于java - 以更智能的方式在 Junit 5(或其他测试 Java 库)中使用数组参数化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48790135/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com