2012-11-05 26 views
2
@PrepareForTest({...,..., XXX.class}) 
... 
@Test 
public void testMethodToBeTested(){ 
    XXX mockInstance = PowerMock.createMock(XXX.class); 
    ... 
    PowerMock.expectNew(XXX.class, p1, p2, p3, p4, p5).andReturn(mockInstance); 
    mockInstance.methodWithNoReturnVal(); 
    expect(mockInstance.getSearchVal()).andReturn(1); 
    PowerMock.replay(mockInstance); 
    Whitebox.invokeMethod(objInstance, "methodToBeTested"); 

    PowerMock.verify(mockInstance); 
} 

本質上,我想測試一個私有方法:methodToBeTested()。該方法實例化一個XXX.class類型的對象(使用new運算符)並將其存儲到一個實例變量中;我嘲笑這個東西。然後,它通過模擬調用methodWithNoReturnVal(),然後我配置返回1的getter方法。PowerMock - IllegalStateException:必須重播類XXX以獲得配置期望

我得到錯誤「IllegalStateException:必須重放類XXX.class以獲取配置的期望值。

任何幫助表示讚賞。我對PowerMock和EasyMock仍然很陌生;因爲我需要使用expectNew(...)方法,所以我確保在測試方法中使用所有PowerMock API。

回答

3

您需要在Powermock的方法中有一個PowerMock.replay(XXX.class);來攔截對象的構造。見下文。

@PrepareForTest({...,..., XXX.class}) 
... 
@Test 
public void testMethodToBeTested(){ 
    XXX mockInstance = PowerMock.createMock(XXX.class); 
    ... 
    PowerMock.expectNew(XXX.class, p1, p2, p3, p4, p5).andReturn(mockInstance); 
    mockInstance.methodWithNoReturnVal(); 
    expect(mockInstance.getSearchVal()).andReturn(1); 
    PowerMock.replay(mockInstance, XXX.class); 
    Whitebox.invokeMethod(objInstance, "methodToBeTested"); 

    PowerMock.verify(mockInstance); 
} 
+0

爲什麼它需要XXX.class,但不適用於其他情況? – kchang

+0

@kchang,我真的不完全確定我明白爲什麼它需要它,我只知道它的工作原理,並且我在這個網站上找到了它的文檔[link](https://code.google.com/p/ powermock/wiki/MockConstructor)如果我不得不猜測爲什麼它是必需的,我假設它必須與PowerMock檢查'XXX'類的每個新實例的方式有關,以查看參數是否與預期相符,但這只是一個猜測。希望有所幫助。 – HardcoreBro

相關問題