2012-01-13 244 views
0

問題:嘗試執行PowerMockito.doNothing()時拋出Nullpointer異常。PowerMokito doNothing()在私人setter上空指針

我需要創建一個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) 在有機.powermock.api.mockito.internal.expectation.PowerMockitoStubberImpl.when(PowerMockitoStubberImpl.java:43) 在org.powermock.api.mockito.internal.expectation.PowerMockitoStubberImpl.when(PowerMockitoStubberImpl.java:104)

回答

1

我已經廣泛使用PowerMockito來嘗試處理在一些棘手的遺留Java代碼上編寫單元測試。我可以告訴你的最好的不是你認爲應該工作的所有東西都能正常工作,而且在線例子的年齡和質量都是混合的。間諜工作是爲了執行verifyPrivate,但我幾乎沒有成功使用PowerMockito來模擬私人方法調用。

你確實有幾個可能的動作:使私有方法受到保護(然後你可以使用Mockito部分模擬來做你想做的事情),或者重構代碼,這樣你就沒有這些私有的方法並且可以@Mock另一個對象,從而對公共調用有完全的模擬控制。當然,我不知道還有什麼其他限制。

+0

感謝您的輸入。雅我厭倦了最新版本的Mockito,並且使用返回模擬私有方法沒有問題,只是當它們是空的時候。然而壓制(方法)允許我移動私有setter方法。 – haju 2012-01-13 17:38:39