接上篇:https://developer.aliyun.com/article/1227480?spm=a2c6h.13148508.setting.31.48e04f0eaBVGWH
九、 JSON结合Mockito妙用
上面已经介绍过,JSON序列化在编写Java单元测试用例时最大的妙用有两点:
• JSON反序列化字符串为数据对象,大大减少了数据对象的模拟代码;
• JSON序列化数据对象为字符串,把数据对象验证简化为字符串验证,大大减少了数据对象的验证代码。
除此之外,JSON序列化结合Mockito,往往会起到意想不到的效果,能产生一些非常巧妙有效的用法。
1. 模拟方法返回多个值
当一个方法需要多次调用,但返回值跟输入参数无关,只跟调用顺序有关的时,可以用数组来模拟方法返回值。先加载一个列表JSON资源文件,通过JSON.parseObject方法转化为数组,然后利用Mockito的doReturn-when或when-thenReturn语法来模拟方法返回多个值。
2. 模拟方法返回对应值
当一个方法需要多次调用,但返回值跟调用顺序有关,只能调输入参数有关的时,可以用映射来模拟方法返回值。先加载一个映射JSON资源文件,通过JSON.parseObject方法转化为映射,然后利用Mockito的doAnswer-when或when-thenAnswer语法来模拟方法返回对应值(根据指定参数返回映射中的对应值)。
3. 验证多次方法调用参数
当验证一个方法调用参数时,需要用ArgumentCaptor来捕获这个参数,然后通过getValue方法验证这个参数。如果这个方法被多次调用,就没有必要依次验证了,可以通过getAllValues方法获取一个列表,然后通过JSON.toJSONString转化为JSON字符串,然后跟JSON资源文件进行统一验证。
当然,二者结合的妙用不仅限于此,还有更多作者没有总结到的。
后记
闲暇之余,填词一首自娱自乐,借以致敬广大的码农们:
《卜算子·致码农》
业务要精通,
眼界需开阔。
谈笑风生略几回,
草案心头过。
编写守规则,
测试知结果。
奋笔疾书数万行,
代码无一错。
其中,第二段便说明了代码规范和单元测试的重要性——只有做到“编写守规则,测试知结果”,才能保障“奋笔疾书数万行,代码无一错”。