一、Mock简介
背景:小明和小刚要为app制作一个登陆功能,小明负责网络交互获取服务器的认证数据,小刚负责将获取到的数据写入到数据库中,然后能够使用户自动登陆。小刚的开发的速度比较快,已经完成了数据库互这一块,但是小明的网络交互还没有开发完成。那么小刚怎么测试自己的数据库是否完成呢?小刚就要自己创建一个类,模拟登陆,然后进行测试。
首先创建User类
public class User {
private String id;
private String pwd;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
@Override
public String toString() {
return "User [id=" + id + ", pwd=" + pwd + "]";
}
}
然后创建数据库存储类UserDao
public class UserDao {
public void saveUserInfo(User user){
//存储数据
System.out.println(user);
}
}
之后创建自己的测试登陆类Login (这就是一个简单的Mock)
public interface ILogin {
public User login();
}
public User login(){
User user = new User();
ser.setId("1");
user.setPwd("123");
return user;
}
最近创建测试类进行测试SaveTest
public class SaveTest extends TestCase{
private UserDao mUserDao;
private ILogin mLogin;
@Override
protected void setUp() throws Exception {
// TODO Auto-generated method stub
super.setUp();
mUserDao = new UserDao();
mLogin = new LoginImpl();
}
public void testSave(){
mUserDao.saveUserInfo(mLogin.login());
}
@Override
protected void tearDown() throws Exception {
// TODO Auto-generated method stub
super.tearDown();
mUserDao = null;
mLogin = null;
}
}
根据上面的例子我们可以得出:Mock代表的是
模拟某个类(Login类)的行为。这个类是测试你的模块必不可少的类。(必须得有Login才能调用saveUser()存储User)。
但是如果测试模块需要多个未完成的外部类,那么岂不是需要些很多个Mock。为了简化这个过程,就出现了Mockito库。
二、Mockito的使用
①Mockito两个重要的概念
Mock:对象用来判断测试是否能通过,也就是用来验证测试中依赖对象间的交互能否达到预期。
Stub:
完全是模拟一个外部依赖,用来提供测试时所需要的测试数据。(调用盖房只为获取方法的返回值,且该返回值是由自己设定。形式就是调用了方法,没有调用方法的内部实现,然后返回自己设定的返回值)
②、使用
Mock的作用
1、测试对象的行为次数(从未、至少、至多、具体次数)
//设置为静态import
import static org.mockito.Mockito.*;
public class TestMock extends TestCase {
public void testList(){
//知识点①
List mockList = mock(List.class);
//知识点③
mockList.add("1");
//知识点②
verify(mockList,times(2)).add("1");
}
}
①、使用类的Class类创建测试对象,该类可以是接口、或者具体类。因为并非真正的调用该类的真实方法。
②、verify(Object obj,VerficationMode mode):计算该类的方法被调用的次数。