2013-05-06 69 views
4

對象的另一種方法,我有一個接口,前一種方法:測試它調用的Mockito

interface MyService { 
    void createObj(int id) 
    void createObjects() 
} 

我想測試createObjects方法的實現,它的身體像:

void createObjects() { 
    ... 
    for (...) { 
    createObj(someId); 
    } 
} 

我已經測試createObj(id)

@Test public void testCreate() { 
    //given 
    int id = 123; 
    DAO mock = mock(DAO.class); 
    MyService service = new MyServiceImpl(mock); 

    //when 
    service.createObj(id); 

    //verify 
    verify(mock).create(eq(id)); 
} 

所以我不想重複所有測試用例爲createObjects

如何確保除了正在測試的實體之外還調用了另一種真實對象的方法?

回答

7

使用間諜:

MyService myService = new MyServiceImpl() 
MyService spy = spy(myService); 
doNothing().when(spy).createObj(anyInt()); 

// now call spy.createObjects() and verify that spy.createObj() has been called 

這說明,像任何事物一樣,在the api doc

+0

謝謝。我正在使用這個。但文檔說,這可以「聞」,所以我想爲什麼是這樣以及如何避免:) – glaz666 2013-05-06 14:50:12

+0

這正是間諜的目的。 「嗅覺」並不一定意味着什麼是錯的;只有某些**可能是錯誤的。在這種特殊情況下,這是正確的。 – 2013-05-06 21:29:40