Частная заглушка Powermock работает неправильно

Я пытаюсь сделать простой пример, который можно найти на официальной странице PowerMock (здесь). Я делаю частичный макет этого класса:

public class Simple {


    public String doMe() {
        return privateMethod();
    }

    private String privateMethod() {
       return "POWERMOCK sucks";

    }

}

И написал простой тестовый класс:

@RunWith(PowerMockRunner.class)
@PrepareForTest(Simple.class)
public class ProcessorTest  {

    @Test
    public void doMe() throws Exception {
        Simple spy = PowerMockito.spy(new Simple());
        PowerMockito.doReturn("hello").when(spy, "privateMethod");
        String res = spy.doMe();

        PowerMockito.verifyPrivate(spy, Mockito.times(1000)).invoke(
                "privateMethod");
        Assert.assertEquals( res, "hello");
    }


}

Но результат такой:

java.lang.AssertionError: expected [hello] but found [null]
Expected :hello
Actual   :null
 <Click to see difference>


    at org.testng.Assert.fail(Assert.java:94)

Таким образом, Powermock не только не может издеваться над privateMethod и возвращать «null», но и в том, что он вызывался 1000 раз, когда это не так.

Становится еще более жутко, если я попытаюсь испортить насмешку следующим образом:

PowerMockito.doReturn(1).when(spy, "privateMethod");

Итак, я пытаюсь вернуть целое число вместо строки из privateMethod. Тогда я получаю это:

org.mockito.exceptions.misusing.WrongTypeOfReturnValue: 
Integer cannot be returned by doMe()
doMe() should return String
***

Итак, по какой-то причине Powermock пытается издеваться над общедоступным методом doMe.

Кто-нибудь понимает, что происходит? Я не.

Спасибо.

Моя среда:

Java 1.8, Мокито 1.10.19, Powermock 1.6.2


person Anton    schedule 18.03.2016    source источник
comment
Я не могу воспроизвести вашу проблему, используя фрагмент кода. Пожалуйста, посмотрите мой пример на Github   -  person Arthur Zagretdinov    schedule 18.03.2016
comment
какая у вас конфигурация?   -  person Anton    schedule 20.03.2016
comment
Я использую: JDK 1.8.0_74 для MacOS и все остальные библиотеки имеют ту же версию, что и вы. Вы можете проверить это на Github   -  person Arthur Zagretdinov    schedule 20.03.2016


Ответы (1)


Хорошо, я нашел решение, проблема заключалась в том, что @RunWith JUnit на самом деле не справлялся с задачей, поэтому мне пришлось расширить PowerMockTestCase, чтобы заставить его работать. Теперь тест выглядит так, и он работает как шарм:

@PrepareForTest(Simple.class)
public class ProcessorTest extends PowerMockTestCase {
    @Test
    public void doMe() throws Exception {
        Simple spy = PowerMockito.spy(new Simple());
        PowerMockito.doReturn("hello").when(spy, "privateMethod");

        String res = spy.doMe();

        PowerMockito.verifyPrivate(spy, Mockito.times(1)).invoke(
                "privateMethod");
        Assert.assertEquals( res, "hello");
    }
}
person Anton    schedule 21.03.2016