微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在java中的ParameterizedTest中传递int数组

如何解决在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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?