2013-09-25 45 views
0

在方法內部存在一個正在實例化的類的本地實例。 如使用powerMock在void方法上進行驗證

class TestMe{ 
    public void foo() 
    { 
     A a = new A(); 
     a.setState(this); 
    } 
    } 




class A 
{ 
    private B b; 

    public void setState(TestMe tm) 
    { 
     b.doSomething(); //returns void 
     b.doSomethingAdditional(); //returns void 
    } 
} 

當測試FOO,使用powerMock,我想做一個驗證,以確保方法DoSomething的()和doSomethingAdditional()被調用。我正在沿着Mockito.verify(ObjectName).functionName()的方向去做。有什麼建議麼??

回答

2

PowerMock與Mockito結合使用。您仍應具備使用Mockito調用進行驗證的所有功能。

一旦你模擬B,當你模擬它的功能,然後將它傳遞到A,你可以使用Mockito.verify

verify(mockBObject).doSomething(); 
verify(mockBObject).doSomethingAdditional(); 

這可能需要一些額外的步驟勾你的模擬對象爲A,因爲你沒有一個構造函數,你可以定義B傳遞,還是有一定的構造掛接到。如果您只是在創建A時對A進行初始化B,則可以使用一些PowerMockito工具來告訴它該做什麼。只是嘲諷B不會這樣做,因爲當你的A被設置時,它不知道在你的代碼中使用你的模擬對象作爲B內部。

PowerMockito.whenNew(B.class).withNoArguments().thenReturn(mockBObject);

截至目前B是從未設置或初始化,因此它可能會導致一些問題。如果B是您假定在其他地方創建的靜態單例對象,則可以執行類似的模擬靜態getInstance()調用以返回B的模擬。

+0

感謝您的有用評論。我查看了有問題的代碼,不幸的是B沒有setter方法。它在本地構建,用於完成一些任務,然後gc'd。那麼有沒有解決這個問題呢? –

+0

B如何在您的實際代碼中進行初始化。 A是否在某種設置功能中創建一個新的?如果A在第一次嘗試使用它時爲空,那麼它是否會創建一個新的B?你使用什麼模式。在setState中設置 – Walls

+0

,構造B並調用函數。 –