① 使用 mockito 生成 Mock 对象;
② 定义(并非录制) Mock 对象的行为和输出(expectations部分);
③ 调用 Mock 对象方法进行单元测试;
② 定义(并非录制) Mock 对象的行为和输出(expectations部分);
③ 调用 Mock 对象方法进行单元测试;
④ 对 Mock 对象的行为进行验证
从网上找来一个最简单的代码实例,下面以具体代码演示如何使用Mockito,代码有三个类,分别如下:
Person类:
public class Person { private final int id; private final String name; public Person(int id, String name) { this.id = id; this.name = name; } public int getId() { return id; } public String getName() { return name; } }
PersonDao类:
public interface PersonDao { Person getPerson(int id); boolean update(Person person); }
PersonService类:
public class PersonService { private final PersonDao personDao; public PersonService(PersonDao personDao) { this.personDao = personDao; } public boolean update(int id, String name) { Person person = personDao.getPerson(id); if (person == null) { return false; } Person personUpdate = new Person(person.getId(), name); return personDao.update(personUpdate); } }
输入以下两个测试方法:
import org.junit.Before; import org.junit.Test; import static org.junit.Assert.*; import static org.mockito.Mockito.*; public class PersonServiceTest { private PersonDao mockDao; private PersonService personService; @Before public void setUp() throws Exception { //模拟PersonDao对象 mockDao = mock(PersonDao.class); when(mockDao.getPerson(1)).thenReturn(new Person(1, "Person1")); when(mockDao.update(isA(Person.class))).thenReturn(true); personService = new PersonService(mockDao); } @Test public void testUpdate() throws Exception { boolean result = personService.update(1, "new name"); assertTrue("must true", result); //验证是否执行过一次getPerson(1) verify(mockDao, times(1)).getPerson(eq(1)); //验证是否执行过一次update verify(mockDao, times(1)).update(isA(Person.class)); } @Test public void testUpdateNotFind() throws Exception { boolean result = personService.update(2, "new name"); assertFalse("must true", result); //验证是否执行过一次getPerson(1) verify(mockDao, times(1)).getPerson(eq(1)); //验证是否执行过一次update verify(mockDao, never()).update(isA(Person.class)); } }
注意:我们对PersonDAO进行mock,并且设置stubbing,stubbing设置如下:
- 当getPerson方法传入1的时候,返回一个Person对象,否则默认返回空
- 当调update方法的时候,返回true
这里使用了参数匹配器:
isA():Object argument that implements the given class.
eq():int argument that is equal to the given value
注:参数匹配的概念这里不再展开叙述。
验证了两种情况:
- 更新id为1的Person的名字,预期:能在DAO中找到Person并更新成功
- 更新id为2的Person的名字,预期:不能在DAO中找到Person,更新失败