如何解决在java中的ParameterizedTest中传递int数组
我试图传入一个数组来测试某个算法,但这些数组似乎没有被正确传递或根本没有传递。我手动测试了算法,所以我知道它可以正常工作。如何传递数组以在 JUnit 5 中进行测试?
@ParameterizedTest
@CsvSource(value = {"[13,14,65,456,31,83],[1331,65456]"})
public void palindromeCombos(int[] input,int[] expected){
palindrome pal = new palindrome();
List<Integer> actual = pal.allpalindromes(input);
int[] result = new int[actual.size()];
for(int i = 0; i < actual.size(); i++){
result[i] = actual.get(i);
}
Assertions.assertArrayEquals(expected,result);
}
解决方法
Pablo's Answer 是正确的,当然,但我个人不喜欢解析字符串,如果我不是绝对必须的话。另一种方法是使用 MethodSource
代替,并明确提供您需要的参数:
public static Stream<Arguments> palindromeCombos() {
return Stream.of(
Arguments.of(new int[]{13,14,65,456,31,83},new int[]{1331,65456}));
}
@ParameterizedTest
@MethodSource
public void palindromeCombos(int[] input,int[] expected) {
// Test logic...
}
,
由于数组没有隐式转换,你可以使用显式转换,首先你需要声明你的转换器类:
class IntArrayConverter implements ArgumentConverter {
@Override
public Object convert(Object source,ParameterContext context)
throws ArgumentConversionException {
if (!(source instanceof String)) {
throw new IllegalArgumentException(
"The argument should be a string: " + source);
}
try {
return Arrays.stream(((String) source).split(",")).mapToInt(Integer::parseInt).toArray();
} catch (Exception e) {
e.printStackTrace();
throw new IllegalArgumentException("Failed to convert",e);
}
}
}
然后你可以在你的测试中使用它:
@ParameterizedTest
@CsvSource(value = {
"13,83;1331,65456","1,2,3,4,5,6;10,20"},delimiterString = ";")
public void palindromeCombos(@ConvertWith(IntArrayConverter.class) int[] input,@ConvertWith(IntArrayConverter.class) int[] expected) {
System.out.println(Arrays.toString(input));
System.out.println(Arrays.toString(expected));
}
请注意,我从 CsvSource 中删除了 []
并将分隔符更改为 ;
,因此数组由以逗号分隔的整数列表表示。
如果您愿意,您可以保留您拥有的格式并在转换器类中处理它。
对于这两个示例,输出为:
[13,83]
[1331,65456]
[1,6]
[10,20]
如果您需要更多信息,可以查看此帖子:https://www.baeldung.com/parameterized-tests-junit-5
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。