JUnit 测试 - ParameterizedTests - “没有将类型 java.lang.Integer 隐式转换为类型 [Ljava.lang.Integer;”

Nuk*_*Pan 5 java testing junit

使用 JUnit5。这对我来说似乎表现不正确,我可能错过了一些东西。

    @ParameterizedTest
    @MethodSource
    void testFunc(Integer arr []) {
        for(Integer i : arr){
            System.out.print(i + " ");
        }
        System.out.println("\n");
    }

    static Stream<Arguments> testFunc() {
        return Stream.of(
                Arguments.of(new Integer [] {12, 42, 52, 1234, 12, 425, 4}),
                Arguments.of(new Integer [] {12, 42, 52, 1234, 12, 425}),
                Arguments.of(new Integer [] {12})
        );
    }
Run Code Online (Sandbox Code Playgroud)

产生错误:

org.junit.jupiter.api.extension.ParameterResolutionException: Error converting parameter at index 0: No implicit conversion to convert object of type java.lang.Integer to type [Ljava.lang.Integer;
Run Code Online (Sandbox Code Playgroud)

int我还尝试使用而不是上面的代码Integer,但这工作正常。

这可以正常工作,没有错误:

    public static void main(String args[]){
        test(new Integer []{12, 42, 52, 1234, 12, 425, 4});
    }

    static void test(Integer[] arr) {
        for(Integer a : arr){
            System.out.println(a);
        }
    }
Run Code Online (Sandbox Code Playgroud)

Lin*_*ica 6

您收到此错误,因为 的方法声明Arguments.of()如下:

public static Arguments of(Object... arguments)
Run Code Online (Sandbox Code Playgroud)

Object...表示一个varargs(可变参数)参数,所以写的时候:

Arguments.of(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

在编译时,java 会将其解糖到一个数组中:

Arguments.of(new Object[]{1, 2, 3})
Run Code Online (Sandbox Code Playgroud)

您遇到的问题可以通过以下方式显示:

Integer[] ints = new Integer[]{1, 2, 3};
Object[] objs = ints; // works
Run Code Online (Sandbox Code Playgroud)

所以当你写:

Arguments.of(new Integer[]{12, 42, 52, 1234, 12, 425, 4})
Run Code Online (Sandbox Code Playgroud)

然后 java 会直接将此数组传递到方法中,它的行为实际上与以下两者相同:

Arguments.of(new Object[]{12, 42, 52, 1234, 12, 425, 4})
Arguments.of(12, 42, 52, 1234, 12, 425, 4)
Run Code Online (Sandbox Code Playgroud)

为了解决这个问题,您需要将Integer[]数组直接转换为Object,这样它将被包装在另一个数组中:

Arguments.of((Object) new Integer[]{12, 42, 52, 1234, 12, 425, 4})
Run Code Online (Sandbox Code Playgroud)

会变成:

Arguments.of(new Object[]{new Integer[]{12, 42, 52, 1234, 12, 425, 4}})
Run Code Online (Sandbox Code Playgroud)

正如您所指出的,它可以正常工作,int[]因为以下内容不起作用:

int[] ints = new int[]{1, 2, 3};
Object[] objs = ints; // int[] cannot be assigned to Object[]
Run Code Online (Sandbox Code Playgroud)