一级工程实践讲师:刘晓光单元测试本节课主要内容:Mock及Mock框架依赖注入的概念Junit的数据驱动单元测试•外部依赖某个函数,方法调用其他资源,如网络、数据库、容器等。例子:1.一个函数的功能:当文件系统满了会返回错误提示。2.某段代码要连第三方的支付接口。3.在某个系统初始化过程中,需要连接2个数据库,1个监控平台。调用就产生了依赖,我们管这些叫做外部依赖。单元测试•什么是MOCK?mock的英文释义是“仿制品”,顾名思义,我们要在代码中提供外部依赖的“仿制品”来模拟外部依赖项的数据或者行为。单元测试•为什么要MOCK?依赖越多,不可控制的因素就越多,在其上建立起来的测试就会越复杂、也越不稳定。很多外部依赖是很昂贵的,无法长期用来调试。外部依赖有可能无法在项目初期得到,难道就不干活了?调用的资源越多,速度就会越慢。还记得单元测试与接口测试的区别么?单元测试•什么是MOCK框架?我们能够自己用代码从头编写Mock,但是这样会很麻烦。幸运的是,现在有很多现成的Mock框架可以使用。Mock框架可以帮助我们迅速的搭建起所需的“仿制品”。单元测试•课程所使用的Mock框架课程将使用Mockito官方网址为:http://mockito.org/使用方法:在Maven等构建工具中添加依赖项,或者直接引用Jar包单元测试•Mockito的一个例子单元测试上页解读:importstaticorg.mockito.Mockito.*;所有Mockito的常用方法都在这个包里,静态引用让我们使用起来更方便。还记得junit中assert也是被静态引用的么?LinkedListmockedList=mock(LinkedList.class);使用mock方法创建mock对象,注意,我们将LinkedList的类型当做参数传了进去。这里边一定用了反射技术。when(mockedList.get(0)).thenReturn("first");使用when和thenReturen方法,其作用不言而明。发现问题了没有?单元测试参数通配符get(0),get(1),get(999)参数全部要输入具体的值。能否有通配符一类的东西?mockito提供了这一特性看下列代码:注意anyInt()方法。单元测试如何模拟抛出异常?when(mockedList.get(3)).thenThrow(newRuntimeException());如果没有模拟,则返回nullSystem.out.println(mockedList.get(4));单元测试如何模拟没有返回值的方法抛出异常?先设定规则:doThrow(newRuntimeException()).when(mockedList).clear();再触发规则mockedList.clear();单元测试如何查看方法是否被调用,以及被调用的次数?注意verify方法的使用。如何检验...