课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
单元测试是程序员在学习软件测试技术的时候需要熟练掌握的一个测试方法,而今天我们就通过案例分析来了解一下,单元测试实施原则与注意事项。
一、单元测试实施原则
Mock脱离数据库+不启动Spring+优化测试速度+不引入项目组件
单元测试不应该依赖数据,依赖外部服务或组件等,会对其他数据产生影响的情况。启动Spring容器,一般比较慢,可能会启动消息监听消费消息,定时任务的执行等,对数据产生影响。
Mock测试就是在测试过程中,对那些当前测试不关心的,不容易构建的对象,用一个虚拟对象来代替测试的情形。
说白了:就是解耦(虚拟化)要测试的目标方法中调用的其它方法,例如:Service的方法调用Mapper类的方法,这时候就要把Mapper类Mock掉(产生一个虚拟对象),这样我们可以自由的控制这个Mapper类中的方法,让它们返回想要的结果、抛出指定异常、验证方法的调用次数等等。
二、减少单元测试对外部的依赖和副作用,提高单元测试效率
不使用@Autowired,@Resource,需要启动Spring容器,测试速度慢,会产生副作用;
不使用@SpringBootTest,@SpringBootTest(classes=Application.class),这会启动整个SpringBoot服务
不应调用数据库,除非是做数据库操作相关的测试,虽然可配置事务回滚,但大多数情况下还是会产生脏数据等问题
使用Assert断言,用于判断某个特定条件下某个方法的行为,为了证明某段代码的执行结果和期望的一致
画外音:单元测试应小而轻,提交测试效率,较少对外部的依赖,比如数据库、Spring容器、网络服务等,而只关心我们自己的代码,通过Mock来解决对外部的依赖
三、Mockito的使用
基本使用
使用静态方法mock()
使用注解@Mock标注
如果使用@Mock注解,必须去触发所标注对象的创建.可以使用MockitoRule来实现.它调用了静态方法MockitoAnnotations.initMocks(this)去初始化这个被注解标注的字段.或者也可以使用@RunWith(MockitoJUnitRunner.class).
“whenthenReturn”和”whenthenThrow”
模拟对象可以根据传入方法中的参数来返回不同的值,when(….).thenReturn(….)方法是用来根据特定的参数来返回特定的值.
我们也可以使用像anyString或者anyIntanyLongany这样的方法来定义某个依赖数据类型的方法返回特定的值.
“doReturnwhen”和“doThrowwhen”
doReturn(…).when(…)的方法调用和when(….).thenReturn(….)类似.对于调用过程中抛出的异常非常有用.而doThrow则也是它的一个变体.
四、常用注解
@Mock:对函数的调用均执行mock(即虚假函数),不执行真正部分。
@Spy:对函数的调用均执行真正部分。
@InjectMocks:创建一个实例,简单的说是这个Mock可以调用真实代码的方法,使用@Mock(或@Spy)注解创建的mock将被注入到用该实例中。
Mockito中的Mock和Spy都可用于拦截那些尚未实现或不期望被真实调用的对象和方法,并为其设置自定义行为。二者的区别在于Mock不真实调用,Spy会真实调用。
@MockBean:功能同@Mock,只是会将实例放入Spring容器管理
@SpyBean:功能同@Spy,只是会将实例放入Spring容器管理
Spy和Mock生成的对象不受Spring管理
Spy调用真实方法时,其它bean是无法注入的,要使用注入,要使用SpyBean
SpyBean和MockBean生成的对象受Spring管理,相当于自动替换对应类型bean的注入,比如@Autowired、@Resource等注入
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请在707945861群中学习了解。