Почему я получаю несоответствие типа аргумента, когда я использую аргументы с имитируемым статическим методом PowerMockito?

Я использую PowerMockito для имитации вызова статического класса, и у метода есть аргумент, который представляет собой массив объектов. Таким образом, вызов должен выглядеть примерно так:

String temp = MyClass.doSomething(MyObject[] objArray1);

Но когда я пытаюсь издеваться над PowerMockito следующим образом:

@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:

Аргумент типа MyObject[] должен быть явно приведен к Object[] для вызова метода varargs when(Class, String, Object...) из типа PowerMockito. В качестве альтернативы его можно было бы привести к объекту для вызова varargs. Но когда я привожу к объекту следующим образом:

PowerMockito.when(MyClass.class, "doSomething", (Object) objArray1).thenReturn("A String");

У меня не возвращается эта строка при выполнении этого метода, я предполагаю, что это связано с тем, что параметр типа объекта приводит к тому, что метод не распознается, поскольку он ожидает что-то типа MyObject в качестве параметра.

Любые идеи о том, как передать непримитив без приведения в качестве объекта или как заставить метод распознаваться при приведении?


person user3897392    schedule 29.07.2015    source источник
comment
Это действительно String temp = MyClass.doSomething(Object[] objArray1); ?   -  person Jose Martinez    schedule 29.07.2015
comment
Нет, метод находится в статическом классе, и его фактическое определение выглядит так: public static String doSomething(MyObject[] objArray) { ...}   -  person user3897392    schedule 29.07.2015
comment
Приведение требуется только для компиляции TestClass, чтобы вызывалась правильная сигнатура метода when; он не изменяет тип самого аргумента. Проблема скорее всего в doSomething. Каковы подписи MyClass.doSomething?   -  person Kenney    schedule 29.07.2015
comment
Я просто издеваюсь над методом MyClass, поэтому он фактически не выполняет никакого кода внутри doSomething(). Разве это не просто признание того, что когда MyClass.doSomething вызывается с параметром типа MyObject[] и затем возвращает строку?   -  person user3897392    schedule 29.07.2015


Ответы (2)


попробуйте это

PowerMockito.doReturn("A String").when(MyClass.class, "doSomething", Matchers.anyObject());

person kswaughs    schedule 30.07.2015

Это нормально. Вам нужно выбрать Object... objs или Object[] 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
person Jose Martinez    schedule 29.07.2015