mock测试
就是在测试过程中,对于某些不容易构造或者 不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。
mock对象
这个虚拟的对象就是mock对象。mock对象就是真实对象在调试期间的代替品。
mock对象使用范畴
真实对象具有不可确定的行为,产生不可预测的效果,(如:股票行情,天气预报) 真实对象很难被创建的 真实对象的某些行为很难被触发 真实对象实际上还不存在的(和其他开发小组或者和新的硬件打交道)等等.
使用mock对象测试的关键步骤
使用一个接口来描述这个对象 在产品代码中实现这个接口 在测试代码中实现这个接口 在被测试代码中只是通过接口来引用对象,所以它不知道这个引用的对象是真实对象还是mock对象。
MOCk前期准备
使用mock要先在程序中导入mock包,使用powermock就导入powermock这个包,使用mockito就导入这个包
Mocktio 在程序中可以import org.mockito.Mockito;然后调用它的static方法,或者import static org.mockito.Mockito.*;个人倾向于后者,因为这样可以更方便些。
Mock使用的常用简单语句有下面,当然这不是mock全部语句,只是本人常用的语句:
- Mock对象的创建
mock(class or interface)
假设我们创建Iterator接口的mock对象
Iterator<String> i = mock(Iterator.class)
- 对方法设定返回值
When(mock.someMethod()).thenReturn(value)
when(i.next()).thenReturn(“hello”)
也可以迭代返回值设定when(i.next()).thenReturn(“hello”).thenReturn(“world”)
- 对方法设定返回异常
When(i.next()).thenthrow(new RuntimeException())
- Mock对象行为验证
verify(mock).someMethod(…)
下面是在一个开发工具中使用mock一个简单实例:
使用背景:此开发工具创建时自动生动5个项目,分别为data项目、impl项目、service项目、test项目、web项目;其中一个test项目,用于测试前面四个项目
简单操作四个项目:在data项目中创建DAO,数据访问向导,即po层
在impl项目中创建ROLE,角色层
用ROLE调用DATA
最后用test项目测试是否ROLE中调用DAO是否成功
下面是一段简单的test项目中调用的过程:
import com.ygsoft.ecp.abc.data.service.IHHDao;
import com.ygsoft.ecp.abc.test.data.HHDaoTest;
import org.junit.Test;
import static org.junit.Assert.fail;
import static org.powermock.api.mockito.PowerMockito.mock;
import static org.powermock.api.mockito.PowerMockito.when;/*** DDRole.<br>*/
public class DDRoleTest {@Testpublic void testMethod0() throws Throwable {HHDao test = mock(HHDao.class);//when(test,"method","aa").thenReturn("m1234");when(test,"method","kk").thenCallRealMethod();System.out.println(test.method("kk"));when(test,"method","kk").thenThrow(new NullPointerException());test.method("hh");
}