Junitmockito解耦合测试讲义.doc
文本预览下载声明
Junit mockito解耦合测试
Mock测试是单元测试的重要方法之一。
1、相关网址
官网:/
2、什么是Mock测试
Mock 测试就是在测试过程中,对于某些不容易构造(如 HttpServletRequest 必须在Servlet 容器中才能构造出来)或者不容易获取比较复杂的对象(如 JDBC 中的ResultSet 对象),用一个虚拟的对象(Mock 对象)来创建以便测试的测试方法。
Mock 最大的功能是帮你把单元测试的耦合分解开,如果你的代码对另一个类或者接口有依赖,它能够帮你模拟这些依赖,并帮你验证所调用的依赖的行为。
当我们需要测试A类的时候,如果没有 Mock,则我们需要把整个依赖树都构建出来,而使用 Mock 的话就可以将结构分解开,像下面这样:
只需提供mock B 和mock C 的返回即可的,不需要知道其底层具体是怎么实现的。
3、mock使用的场景和好处
真实的对象具有不确定的行为,产生不可预测效果。(如:股票行情,天气预报),我们经常会遇到测试的时候需要去数据库中查询某些数据,但是未知的,就算是知道的,假如有一天数据被删除了或者被修改了,很难进行回归测试。
真实对象很难被创建的,真实对象的某些行为很难被触发。
真实对象实际上还不存在的。如:某个接口依赖其他系统的服务或者该接口还没开发出来。我们就可以使用mock假设其返回的数据进行测试。而不用等待其开发完接口,我们再进行测试。提高开发的效率
4、一些特点
可以 mock 具体类而不单止是接口
一点注解语法糖 - @Mock
干净的验证错误是 - 点击堆栈跟踪,看看在测试中的失败验证;点击异常的原因来导航到代码中的实际互动。堆栈跟踪总是干干净净。
允许灵活有序的验证(例如:你任意有序 verify ,而不是每一个单独的交互)
支持“详细的用户号码的时间”以及“至少一 次”验证
灵活的验证或使用参数匹配器的 stub ( anyObject() , anyString() 或 refEq() 用于基于反射的相等匹配)
允许创建 自定义的参数匹配器 或者使用现有的 hamcrest 匹配器
5、maven配置
1)Junit的maven
复制代码
dependency
groupIdjunit/groupId
artifactIdjunit/artifactId
version4.11/version
scopetest/scope
/dependency
复制代码
2)mockito的maven
复制代码
dependency
groupIdorg.mockito/groupId
artifactIdmockito-all/artifactId
version1.9.5/version
scopetest/scope
/dependency
复制代码
6、使用
首先我们需要引入静态资源
import static org.mockito.Mockito.*;
import static org.junit.Assert.*;
1)验证行为
复制代码
@Test
public void verify_behaviour(){
//模拟创建一个List对象
List mock = mock(List.class);
//使用mock的对象
mock.add(1);
mock.clear(); //清空mock对象
//验证add(1)和clear()行为是否发生
verify(mock).add(1);
verify(mock).clear();
}
复制代码
2)模拟我们所期望的结果
复制代码
public void when_thenReturn(){
//mock一个Iterator类
Iterator iterator = mock(Iterator.class);
//预设当iterator调用next()时第一次返回hello,第n次都返回world
when(iterator.next()).thenReturn(hello).thenReturn(world);
//使用mock的对象
String result = iterator.next() + +
显示全部