2011-05-10 100 views
4

你好,我想知道什麼是最好的方法來模擬void方法,例如:我有一個PersonManager在測試下,然後我有嘲笑的道。用EasyMock和Mockito嘲笑void方法

class PersonManager { 

    PersonDao dao... 

    PersonManager(PersonDao dao)... 

    Preson find(String person)... 

    void delete(String person)... 

} 

class PersonManagerTest { 

    Map<String, Person> persons ..... = "person1", "person2", "person3"; 

    PersonDao mock... 

    PersonManager manager = new PersonManager(mock); 

    //easy one 
    @Test public void shouldReturnExistingPerson() { 
     expect(mock.find("person1").andReturn(persons.get(0)); 
     Person result = manager.find("person1"); 
     // replay and verify logic 
    } 

    //but what should I do here? 
    @Test public void shouldDeleteExistingPerson() { 
     //should I remove a person from testing Map holding test data? or what am I doing wrong 
    } 
} 

所以測試方法返回很容易,但如何設置void方法?感謝您的建議,Mcokito的例子也歡迎。 }

+0

這些答案都可以接受嗎? – 2011-05-23 10:43:19

回答

4

這完全取決於什麼你想測試。

在mockito中,如果您只想檢查是否使用正確的參數調用了DAO刪除方法,那麼verify就是您想要的。

我建議這正是你想要的,因爲你的單元測試PersonManager不應該測試PersonDao

+0

鏈接已損壞。 – 2017-03-31 21:03:46

1

刪除內容時,建議返回剛刪除的對象。它使測試變得更加簡單,並允許在刪除後執行操作(例如顯示通知,日誌記錄等)。我認爲大多數(所有?)Java集合都在這樣做。

+0

關於大部分/全部。所有的Java集合都從同一個接口繼承,所以如果返回被刪除的對象,所有的都可以。 – 2011-05-10 14:36:45

+1

這是全部真實和正確的,但是非常略微錯過了測試的意圖(據我所知)。測試PersonManager.delete()是否返回Person實例與測試它是否調用PersonDao.delete()不相同。 – 2011-05-10 14:43:28

+0

'PersonPanager.delete()'可以返回'boolean' .. – 2011-05-10 14:58:43

6

隨着簡單的模擬,你不需要圍繞expect()包裝void函數。你只需要像做:

obj = createMock(...) 
obj.someVoidMethod(); 
replay(obj); 
... 
verify(obj); 
0

Mockito提供了一種靜態verify方法,可以驗證您何時調用任何方法,即使那些具有void作爲返回類型的方法。對於你的代碼示例,下面的mockito代碼應該工作:

// Put this among your import statements  
import static org.mockito.Mockito.* 

class PersonManagerTest { 

    private PersonManager manager; // SUT 

    private Map<String, Person> mockedPersons; 

    private PersonDao mockDao; 

    // Don't forget to setup from scratch for each test 
    @Before public void setup() { 
     mockDao = mock(PersonDao.class); // mockito mock method 
     mockedPersons = new HashMap<String, Person>(); 
     for (int i=1; i<=3; i++) { 
      mockedPersons.put("person"+i, mock(Person.class)); 
     } 
     manager = new PersonManager(mockDao); 
    } 

    // setup dao to return a mocked person 
    private void whenPersonIsAdded(int i) { 
     Person personToReturn = mockedPersons.get("person"+i); 
     when(mockDao.find("person"+i)).thenReturn(personToReturn); 
    } 

    @Test public void shouldReturnExistingPerson() { 
     whenPersonIsAdded(1); 
     Person expectedPerson = mockPerson; 

     Person actualPerson = manager.find("person1"); 

     assertEquals(expectedPerson, actualPerson); 
    } 

    @Test public void shouldDeleteExistingPerson() { 
     String expectedPersonString = "person1"; 

     manager.delete(expectedPersonString); 

     verify(mockDao).delete(expectedPersonString); 
    } 
} 

希望這有助於。