概述
mock的概念
在软件开发的世界之外, “mock”一词是指模仿或者效仿. 因此可以将“mock”理解为一个替身,替代者. 在软件开发中提及”mock”,通常理解为模拟对象或者Fake.
mock对象就是在调试期间用来作为真实对象的替代品。
mock测试就是在测试过程中,对那些不容易构建的对象用一个虚拟对象来代替测试的方法就叫mock测试。
Mockito 框架
Mockito 是一个基于MIT协议的开源java测试框架。 Mockito区别于其他模拟框架的地方主要是允许开发者在没有建立“预期”时验证被测系统的行为。对于mock对象的一个评价是测试系统的测试代码是一个高耦合的,由于 Mockito试图通过移除“期望规范”去除expect-run-verify(期望验证模式)的模式,因此在耦合度上有所降低。这样的结果是简化了测试代码,使他更易读和修改了。
实战
一.maven依赖
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.10.19</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
mockito需要junit配合使用。
二、测试步骤
User.java
package com.ricky.codelab.mockito.domain;
public class User {
private long id;
private String name;
private String email;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", email=" + email + "]";
}
}
接口UserDao.java
package com.ricky.codelab.mockito.dao;
import com.ricky.codelab.mockito.domain.User;
public interface UserDao {
public User queryUserByid(long id);
public int update(User user);
}
UserService .java
package com.ricky.codelab.mockito;
import com.ricky.codelab.mockito.dao.UserDao;
import com.ricky.codelab.mockito.domain.User;
public class UserService {
private UserDao userDao;
public UserService(UserDao userDao) {
this.userDao = userDao;
}
public boolean update(long id, String name){
User user = userDao.queryUserByid(id);
if(user==null){
return false;
}
user.setName(name);
userDao.update(user);
return true;
}
}
测试类UserServiceTest.java
package com.ricky.codelab.demo;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import static org.mockito.Mockito.*;
import com.ricky.codelab.mockito.UserService;
import com.ricky.codelab.mockito.dao.UserDao;
import com.ricky.codelab.mockito.domain.User;
public class UserServiceTest {
private UserService userService;
@Mock
private UserDao userDao;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
userService = new UserService(userDao);
}
@Test
public void testVerify() {
User user = new User();
user.setId(1);
user.setName("ricky");
when(userDao.queryUserByid(1)).thenReturn(user);
boolean success = userService.update(1, "Jack");
Assert.assertEquals(true, success);
verify(userDao).queryUserByid(1);
ArgumentCaptor<User> personCaptor = ArgumentCaptor.forClass(User.class);
verify(userDao).update( personCaptor.capture() );
User updatedUser = personCaptor.getValue();
Assert.assertEquals( "Jack", updatedUser.getName());
}
}