Junit 私有setter null指针上的PowerMokito doNothing()

Junit 私有setter null指针上的PowerMokito doNothing(),junit,powermock,Junit,Powermock,问题:尝试执行PowerMockito.doNothing()时引发Nullpointer异常 我需要创建一个partialMockObject类,该类将返回一个私有方法值,而不对另一个私有setter方法执行任何操作 如果我用suppress()替换doNothing(),我可以让它工作,但我想解决这个问题 代码: 堆栈跟踪: ' java.lang.NullPointerException 位于org.powermock.api.mockito.internal.expectation.Po

问题:尝试执行PowerMockito.doNothing()时引发Nullpointer异常

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

如果我用suppress()替换doNothing(),我可以让它工作,但我想解决这个问题

代码:

堆栈跟踪: ' java.lang.NullPointerException 位于org.powermock.api.mockito.internal.expectation.PowerMockitoStubberImpl.addanswersforstubing(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)

我广泛使用PowerMockito来尝试和处理在一些棘手的遗留java代码上编写单元测试。我能告诉你的最好的情况是,并非所有你认为有效的方法都能奏效,而且在线示例的年龄和质量参差不齐。间谍用于执行verifyPrivate,但我使用PowerMockito模拟私有方法调用几乎没有成功


您确实有一些可能的措施:保护私有方法(然后您可以使用Mockito部分mocking来完成您在这里想要做的事情),或者重构代码,这样您就没有这些私有方法,可以@Mock其他对象,从而对公共调用拥有完全的mocking控制。当然,我不知道您还面临哪些其他限制。

谢谢您的意见。是的,我厌倦了Mockito的最新版本,它在模拟带有返回的私有方法时没有问题,只是当它们是空的时候。然而,suppress(方法)允许我移动私有setter方法。
@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);

}