私有的setter Null Pointer上的PowerMockito doNothing()

时间:2012-01-13 16:27:08

标签: junit powermock

问题:尝试执行PowerMockito.doNothing()时抛出Nullpointer异常。

我需要创建一个partialMockObject类,它将返回一个私有方法值,并且不会对另一个私有setter方法执行任何操作。

如果我用supress()替换doNothing(),我可以使它工作,但是想想出来。

代码:

@Test
public void testPowerMockito() throws Exception
{       

    final String methodName1 = "Method1";
    final String methodName2 = "Method2";

    //Using PowerMockito
    ObjectToTest partialMockObject = PowerMockito.spy(new ObjectToTest());

    //Mock the private method, expect that a false
    PowerMockito.doReturn(false).when( partialMockObject,methodName1 );

    //Do Nothing on the void private setter     
    PowerMockito.doNothing().when( ObjectToTest.class,methodName2 );

    String result = partialMockObject.methodToTest();

    assertEquals("Fail","",result);

    //Confirms that the private method was called
    PowerMockito.verifyPrivate(partialMockObject).invoke(methodName1);
    PowerMockito.verifyPrivate(partialMockObject).invoke(methodName1);

}

堆栈跟踪: “ 显示java.lang.NullPointerException     在org.powermock.api.mockito.internal.expectation.PowerMockitoStubberImpl.addAnswersForStubbing(PowerMockitoStubberImpl.java:68)     在org.powermock.api.mockito.internal.expectation.PowerMockitoStubberImpl.when(PowerMockitoStubberImpl.java:43)     在org.powermock.api.mockito.internal.expectation.PowerMockitoStubberImpl.when(PowerMockitoStubberImpl.java:104)

1 个答案:

答案 0 :(得分:1)

我已经广泛使用PowerMockito来尝试处理一些棘手的遗留Java代码的单元测试。我能告诉你的最好的事情是,你认为应该工作的并不是一切都会有效,而且网上的例子都是混合的年龄和质量。该间谍可以用于执行verifyPrivate,但是使用PowerMockito来模拟私有方法调用我几乎没有成功。

你确实有几个可能的举动:保护私有方法(然后你可以使用Mockito部分模拟来做你想做的事情),或重构代码,这样你就没有这些私有方法并且可以@Mock另一个对象,因此对公共调用具有完全的模拟控制。当然,我不知道你正在做什么其他限制。