使用EasyMock和Mockito模拟void方法

时间:2011-05-10 14:22:37

标签: java unit-testing mockito easymock

你好我想知道什么是模拟void方法的最佳方法,例如:我在测试下有一个PersonManager,然后我有被模拟的dao。

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的例子。         }

4 个答案:

答案 0 :(得分:6)

使用easy mock,您不需要在expect()周围包含void函数。你只需要做一些事情:

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

答案 1 :(得分:4)

这完全取决于你想要测试的

在mockito中,如果您只想检查使用正确参数调用DAO delete方法,那么verify就是您想要的。

我建议这正是您想要的,因为PersonManager的单元测试不应该测试PersonDao

答案 2 :(得分:1)

删除内容时,我建议您返回刚删除的对象。它使测试变得更加容易,并允许在删除后执行操作(例如显示通知,记录等)。我认为大多数(所有?)Java集合都是这样做的。

答案 3 :(得分: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);
    }
}

希望这有帮助。