《Java单元测试实战》——简化技巧:Java编程技巧之单元测试用例简化方法(1) https://developer.aliyun.com/article/1232245?groupCode=java
二、 简化模拟依赖方法
1. 利用默认返回值简化模拟依赖方法
模拟对象的方法是具有默认返回值的:当方法返回类型为基础类型时,默认返回值是0或false;当方法返回类型为对象类型时,默认返回值是null。在测试用例中,当需要模拟方法返回值为上述默认值时,我们可以省略这些模拟方法语句。当然,显式地写上这些模拟方法语句,可以让测试用例变得更便于理解。
原始用例:
简化用例:
可以把以上模拟方法语句直接删除。
2. 利用任意匹配参数简化模拟依赖方法
在模拟依赖方法时,有些参数需要使用到后面加载的数据对象,比如下面案例中的UserCreateVO的name属性值。这样,我们就需要提前加载UserCreateVO对象,既让模拟方法语句看起来比较繁琐,又让加载UserCreateVO对象语句和使用UserCreateVO对象语句分离(优秀的代码,变量定义和初始化一般紧挨着变量使用代码)。
简化用例:
可以把以上模拟方法语句直接删除。
利用任意匹配参数就可以解决这些问题,使测试用例变得更简洁更便于维护。但是要注意,验证该方法时,不能再用任意匹配参数去验证,必须使用真实的值去验证。
原始用例:
简化用例:
3. 利用do/thenAnswer简化模拟依赖方法
当一个方法需要调用多次,但返回值跟调用顺序无关,只跟输入参数有关的时,可以用映射来模拟方法不同返回值。先加载一个映射JSON资源文件,通过JSON.parseObject方法转化为映射,然后利用Mockito的doAnswer-when或when-thenAnswer语法来模拟方法返回对应值(根据指定参数返回映射中的对应值)。
原始用例:
简化用例:
4. 利用Mock参数简化模拟链式调用方法
在日常编码过程中,很多人都喜欢使用链式调用,这样可以让代码变得更简洁。对于链式调用,Mockito提供了更加简便的单元测试方法——提供Mockito.RETURNS_DEEP_STUBS参数,实现链式调用的对象自动mock。
被测代码:
原始用例:
正常情况下,每一个依赖对象及其调用方法都要mock,编写的代码如下:
简化用例:
利用Mockito.RETURNS_SELF参数编写的测试用例如下:
代码说明:
•在mock对象时,对于自返回对象,需要指定Mockito.RETURNS_SELF参数;
•在mock方法时,无需对自返回对象进行mock方法,因为框架已经mock方法返回了自身;
•在verify方法时,可以像普通测试法一样优美地验证所有方法调用。
参数说明:
在mock参数中,有2个参数适合于mock链式调用:
•RETURNS_SELF参数:mock调用方法语句最少,适合于链式调用返回相同值;
•RETURNS_DEEP_STUBS参数:mock调用方法语句较少,适合于链式调用返回不同值。
《Java单元测试实战》——简化技巧:Java编程技巧之单元测试用例简化方法(3) https://developer.aliyun.com/article/1232243?groupCode=java