Java 为什么在PowerMockito mocked静态方法中使用参数时会出现参数类型不匹配?

Java 为什么在PowerMockito mocked静态方法中使用参数时会出现参数类型不匹配?,java,unit-testing,casting,powermock,powermockito,Java,Unit Testing,Casting,Powermock,Powermockito,我使用PowerMockito模拟对静态类的调用,该方法有一个作为对象数组的参数。因此,电话应该是这样的: String temp = MyClass.doSomething(MyObject[] objArray1); @RunWith(PowerMockRunner.class) @PrepareForTest(MyClass.class) public class TestClass { @Test public void myTest { MyObject[] myObjAr

我使用PowerMockito模拟对静态类的调用,该方法有一个作为对象数组的参数。因此,电话应该是这样的:

String temp = MyClass.doSomething(MyObject[] objArray1);
@RunWith(PowerMockRunner.class)
@PrepareForTest(MyClass.class)
public class TestClass {

@Test
public void myTest {
    MyObject[] myObjArray1 = new MyObject[1];
    myObjArray1[0] = new MyObject();

    PowerMockito.mockStatic(MyClass.class);
    PowerMockito.when(MyClass.class, "doSomething", myObjArray1).thenReturn("A String");

    ...
}
但是当我试着用PowerMockito这样嘲笑的时候:

String temp = MyClass.doSomething(MyObject[] objArray1);
@RunWith(PowerMockRunner.class)
@PrepareForTest(MyClass.class)
public class TestClass {

@Test
public void myTest {
    MyObject[] myObjArray1 = new MyObject[1];
    myObjArray1[0] = new MyObject();

    PowerMockito.mockStatic(MyClass.class);
    PowerMockito.when(MyClass.class, "doSomething", myObjArray1).thenReturn("A String");

    ...
}
这在Eclipse中给了我一个警告:

当(类、字符串、对象…)来自PowerMockito类型时,MyObject[]类型的参数应显式转换为Object[],以便调用varargs方法。也可以将其强制转换为对象以进行varargs调用 但当我向这样一个物体投射时:

String temp = MyClass.doSomething(MyObject[] objArray1);
@RunWith(PowerMockRunner.class)
@PrepareForTest(MyClass.class)
public class TestClass {

@Test
public void myTest {
    MyObject[] myObjArray1 = new MyObject[1];
    myObjArray1[0] = new MyObject();

    PowerMockito.mockStatic(MyClass.class);
    PowerMockito.when(MyClass.class, "doSomething", myObjArray1).thenReturn("A String");

    ...
}
当这个方法执行时,我没有返回那个字符串,我假设这是因为对象类型参数导致该方法无法识别,因为它期望MyObject类型的东西作为参数


关于如何在不将强制转换为对象的情况下传递非基本体,或者如何通过强制转换识别方法,有什么想法吗?

这是正常的。您需要选择
对象。。。objs
对象[]objs

例如

public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        String[] inputs = {" ", " ", " "};

        method((Object) inputs);
        method((Object[]) inputs);

    }

    static void method(Object... obj) {
        System.out.println("obj.length = " + obj.length);
    }

}
这张照片

obj.length = 1   
obj.length = 3
试试这个


PowerMockito.doReturn(“字符串”).when(MyClass.class,“doSomething”,Matchers.anyObject())

它真的是
字符串temp=MyClass.doSomething(Object[]objArray1)?不,该方法在一个静态类中,其实际定义如下:公共静态字符串doSomething(MyObject[]objArray){…}转换只需要编译TestClass,以便调用
时正确的方法签名
;它不会更改参数本身的类型。问题可能出在
doSomething
中。
MyClass.doSomething
的签名是什么?我只是在模仿MyClass方法,所以它实际上没有在doSomething()中执行任何代码。它不只是认识到当使用MyObject[]类型的参数调用MyClass.doSomething时,然后返回“字符串”吗?