2

我正在尝试传入一个数组来测试某个算法,但数组似乎没有正确传递或根本没有传递。我手动测试了算法,所以我知道它按预期工作。如何在 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);    
}
4

2 回答 2

5

当然, Pablo 的答案是正确的,但如果我不是绝对必须的话,我个人并不喜欢解析字符串。另一种方法可能是使用 aMethodSource代替,并明确提供您需要的参数:

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...
}
于 2020-12-22T22:17:13.743 回答
3

由于数组没有隐式转换,您可以使用显式转换,首先您需要声明您的转换器类:

    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,14,65,456,31,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, 14, 65, 456, 31, 83]
[1331, 65456]

[1, 2, 3, 4, 5, 6]
[10, 20]

如果您需要更多信息,可以查看此帖子:https ://www.baeldung.com/parameterized-tests-junit-5

于 2020-12-22T22:02:21.783 回答