你好我想知道什么是模拟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的例子。 }
答案 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);
}
}
希望这有帮助。