我在jmock网站上尝试了文档,我只是迷失了。对于已经知道如何使用它的人来说,它似乎是很好的文档。我不是其中之一。我正在寻找其中一个。 :)
我有一个服务层,我的应用程序的所有前端都与之通信。服务层使用DAO与数据库通信并返回我的模型对象。我想为这些DAO使用Jmock,这样就无法访问数据库了。
所以,我有实现PersonService的PersonServiceImpl和在hibernate中实现PersonDAO的PersonHibernateDAO。示例人员服务如下。
public class PersonServiceImpl implements PersonService{
public void changeName(int personId, String firstName, String lastName){
person = getPersonDAO.getPerson(int personId);
person.setFirstName(firstName);
person.setLastName(lastName);
getPersonDAO.update(person);
}
}
如何使用jmock对我的人员服务进行单元测试?
答案 0 :(得分:3)
我认为这应该是可行的。
public class MyTestClass{
Mockery context = new Mockery();
private PersonServiceImpl personService;
private PersonDAO dao;
private Person person;
@Before
public void setup(){
person = new Person();
// set up mock to return person object
dao = context.mock(PersonDAO.class);
oneOf (dao).getPerson(5); will(returnValue(person));
// create class under test with mock
personService = new PersonServiceImpl(dao);
}
@Test
public void myTest(){
// expectations
context.checking(new Expectations() {{
oneOf (dao).update(person);
}});
// test
psersonService.changeName(....);
// verify
context.assertIsSatisfied();
}
}
就个人而言,我认为mockito更容易......
public class MyTestClass{
private PersonServiceImpl personService;
private PersonDAO dao;
private Person person;
private ArgumentCaptor<Person> argCaptor;
@Before
public void setup(){
person = new Person();
argCaptor = ArgumentCaptor.forClass(Person.class);
// set up mock to return person object
dao = Mockito.mock(PersonDAO.class);
when(dao.getPerson(5).thenReturn(person);
// create class under test with mock
personService = new PersonServiceImpl(dao);
}
@Test
public void myTest(){
// test
psersonService.changeName(....);
// verify
verify(dao).update(argCaptor.capture());
Person passedPerson = argCaptor.getValue();
assertThat(passedPerson.getFirstName(), equalTo(...));
}
}