2013-02-05 32 views
1

我想嘲笑一個靜態方法,也是一個類的非靜態方法。 我的來源是這樣的:不能嘲笑使用Powermock靜態方法(與EasyMock的)

 
    public class XDSUtilityManager 
    {
private static XDSUtilityManager xdsUtilMgr = new XDSUtilityManager(); private XDSUtilityManager() { xdsUtilMgrImpl = new XDSUtilityManagerImpl(); }
public static XDSUtilityManager getInstance() { return (xdsUtilMgr == null) ? new XDSUtilityManager() : xdsUtilMgr; } public XMLDocument getXMLDocument(final String absoluteKey, final XDSClient xdsClient) { return getXMLDocument(absoluteKey, xdsClient, false); } }

I want to mock static method getInstance(). I want getInstance() to return mock object of XDSUtilityManager class. Also I want to mock getXMLDocument() which is not static.

And in my testCase I tried following:

 
XMLDocument xmlDocument = PowerMock.createMock(XMLDocument.class);
XDSUtilityManager xdsUtilityManager = PowerMock.createPartialMock(XDSUtilityManager.class,"getXMLDocument");
PowerMock.mockStaticPartial(XDSUtilityManager.class, "getInstance"); expect(XDSUtilityManager.getInstance()).andReturn(xdsUtilityManager).anyTimes();
expect(xdsUtilityManager.getXMLDocument((String)anyObject(), anyObject(XDSClient.class))).andReturn(xmlDocument).anyTimes();
PowerMock.replay(xdsUtilityManager); PowerMock.replay(xmlDocument);

但作爲預期的東西不工作。請幫助

回答

6

我發現這樣做是使用PowerMockito最簡單的方法。 PowerMockito是和的Mockito PowerMock,這允許靜態對象的嘲笑的組合。

我用的模式是使用模擬你的靜態getInstance()來回報您的非靜態模擬,然後您可以延長正常的副本。使用PowerMockito一個例子是:

@RunWith(PowerMockRunner.class) 
@PrepareForTest({SingletonObject.class}) 
public class SingletonTester { 
    @Mock 
    private SingletonObject singleMock; 

    @Before 
    public void setup(){ 
     // initialize all the @Mock objects 
     MockitoAnnotations.initMocks(this); 
     // mock all the statics 
     PowerMockito.mockStatic(SingletonObject.class); 
    } 

    @Test 
    public void mockTester(){ 
     // Mock the static getInstance call to return the non-Static Mock 
     Mockito.when(SingletonObject.getInstance()).thenReturn(singleMock); 

     // Mock the non static version as normal 
     PowerMockito.when(singleMock.nonStaticMethodCall()).thenReturn("Whatever you need."); 
     //.......... 
    } 
} 

您對getInstance()靜態調用來獲取單對象返回實例化模擬對象,你也可以定義。一旦你告訴靜態什麼回報,你可以繼續嘲弄非靜態通話正常。

+0

謝謝!這非常有幫助。 –

1

它不需要調用getInstance()方法來創建的XDSUtilityManager實例。 使用PowerMockito,因爲你的構造函數是私有的,你需要suppress the constructor調用創建如下模擬之前..

PowerMockito.suppress(PowerMockito.constructor(XDSUtilityManager.class)); 
// enable static mocking for all the methods in the class 
PowerMockito.mockStatic(XDSUtilityManager.class); 
XDSUtilityManager xDSUtilityManager = PowerMockito.mock(XDSUtilityManager.class); 
XMLDocument xmlDocument = PowerMock.createMock(XMLDocument.class); 
PowerMockito.when(xDSUtilityManager.getXMLDocument(
    Mockito.anyString(),Mockito.anyObject())).thenReturn(xmlDocument);