Powermock私人磕磕绊绊错了

时间:2016-03-18 13:51:28

标签: java unit-testing mockito powermock powermockito

我试图制作一个简单的例子,可以在官方的PowerMock页面上找到(here)。我'对这个类进行部分模拟:

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并且返回&#39; null&#39;它没关系,它被称为1000次。

如果我试图像这样嘲笑那么它会变得更加令人毛骨悚然:

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

所以我试图从privateMethod返回一个Integer而不是String。 然后我明白了:

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

因此,Powermock试图模仿公共doMe方法。

任何人都明白什么是幸福的?我不。。

感谢。

我的环境是:

Java 1.8,Mockito 1.10.19,Powermock 1.6.2

1 个答案:

答案 0 :(得分:0)

好的,我找到了解决方案,问题是JUnit的@RunWith实际上没有做到这一点,所以我必须从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");
    }
}