《Java单元测试实战》——无效单测:那些年,我们写过的无效单元测试(13)

简介: 《Java单元测试实战》——无效单测:那些年,我们写过的无效单元测试(13)

《Java单元测试实战》——无效单测:那些年,我们写过的无效单元测试(12) https://developer.aliyun.com/article/1232103?groupCode=java




5) 验证所有依赖方法调用

 

反面案例:

 

既然不验证所有方法调用有问题,那我就把所有方法调用验证了吧。


image.png

存在问题:

 

所有方法调用都被验证了,看起来应该没有问题了。但是,如果缓存用户方法中,存在别的方法调用。

 

比如:我们在进入缓存用户方法之前,新增了清除所有用户缓存,这个单元测试用是无法验证的。

image.png


6) 完美地验证依赖方法调用

 

验证所有的方法调用,只能保证现在的逻辑没有问题。如果涉及新增方法调用,这个单元测试用例是无法验证出来的。所有,我们需要验证所有依赖对象没有更多方法调用。


完美案例:


image.png

 

 注意:利用ArgumentCaptor(参数捕获器),不但可以验证参数,还可以验证调用次数和顺序。

 

4. 验证方法调用准则

 

1) 必须验证所有的模拟方法调用

 

在单元测试中,涉及到的所有模拟方法都要被验证:


来源于注入对象的方法调用

来源于输入参数的方法调用

来源于返回值的方法调用

来源于静态方法的调用

 

具体案例可以参考《方法调用来源方式》章节。

 

 

 

2) 必须验证所有的模拟对象没有更多方法调用

 

在单元测试中,为了防止被测方法中存在或新增别的方法调用,必须验证所有的模拟对象没有更多方法调用。

 

正例:

 

image.png

备注:

 

作者喜欢在@After方法中对所有模拟对象进行验证,这样就不必在每个单元测试用例中验证模拟对象。

 

image.png

可惜Mockito.verifyNoMoreInteractions不支持无参数就验证所有模拟对象的功能,否则这段代码会变得更简洁。

 

3) 必须使用明确语义的参数值或匹配器

 

验证依赖方法时,必须使用明确语义的参数值或匹配器,不能使用任何不明确语义的匹配器,比如:any系列参数匹配器。

 

正例:

 

image.png

反例:

image.png

后记


最后,根据本文所表达的观点,即兴赋诗七言绝句一首:

 

《单元测试》

 

单元测试分真假,

工匠精神贯始终。

覆盖追求非目的,

回归验证显奇功。

 

意思是:

 

一定要知道如何去分辨单元测试的真假,

一定要把工匠精神贯彻单元测试的始终。

追求单测覆盖率并不是单元测试的目的,

回归验证代码才能彰显单元测试的功效。

相关文章
|
4月前
|
存储 Java 开发者
Java Map实战:用HashMap和TreeMap轻松解决复杂数据结构问题!
【10月更文挑战第17天】本文深入探讨了Java中HashMap和TreeMap两种Map类型的特性和应用场景。HashMap基于哈希表实现,支持高效的数据操作且允许键值为null;TreeMap基于红黑树实现,支持自然排序或自定义排序,确保元素有序。文章通过具体示例展示了两者的实战应用,帮助开发者根据实际需求选择合适的数据结构,提高开发效率。
118 2
|
26天前
|
存储 缓存 Java
Java中的分布式缓存与Memcached集成实战
通过在Java项目中集成Memcached,可以显著提升系统的性能和响应速度。合理的缓存策略、分布式架构设计和异常处理机制是实现高效缓存的关键。希望本文提供的实战示例和优化建议能够帮助开发者更好地应用Memcached,实现高性能的分布式缓存解决方案。
39 9
|
2月前
|
Java
Java基础却常被忽略:全面讲解this的实战技巧!
本次分享来自于一道Java基础的面试试题,对this的各种妙用进行了深度讲解,并分析了一些关于this的常见面试陷阱,主要包括以下几方面内容: 1.什么是this 2.this的场景化使用案例 3.关于this的误区 4.总结与练习
|
2月前
|
Java 程序员
Java基础却常被忽略:全面讲解this的实战技巧!
小米,29岁程序员,分享Java中`this`关键字的用法。`this`代表当前对象引用,用于区分成员变量与局部变量、构造方法间调用、支持链式调用及作为参数传递。文章还探讨了`this`在静态方法和匿名内部类中的使用误区,并提供了练习题。
55 1
|
3月前
|
安全 Java 开发者
Java 多线程并发控制:深入理解与实战应用
《Java多线程并发控制:深入理解与实战应用》一书详细解析了Java多线程编程的核心概念、并发控制技术及其实战技巧,适合Java开发者深入学习和实践参考。
94 8
|
3月前
|
存储 安全 Java
Java多线程编程中的并发容器:深入解析与实战应用####
在本文中,我们将探讨Java多线程编程中的一个核心话题——并发容器。不同于传统单一线程环境下的数据结构,并发容器专为多线程场景设计,确保数据访问的线程安全性和高效性。我们将从基础概念出发,逐步深入到`java.util.concurrent`包下的核心并发容器实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`以及`BlockingQueue`等,通过实例代码演示其使用方法,并分析它们背后的设计原理与适用场景。无论你是Java并发编程的初学者还是希望深化理解的开发者,本文都将为你提供有价值的见解与实践指导。 --- ####
|
4月前
|
存储 消息中间件 安全
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
【10月更文挑战第9天】本文介绍了如何利用JUC组件实现Java服务与硬件通过MQTT的同步通信(RRPC)。通过模拟MQTT通信流程,使用`LinkedBlockingQueue`作为消息队列,详细讲解了消息发送、接收及响应的同步处理机制,包括任务超时处理和内存泄漏的预防措施。文中还提供了具体的类设计和方法实现,帮助理解同步通信的内部工作原理。
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
|
4月前
|
开发框架 Java 程序员
揭开Java反射的神秘面纱:从原理到实战应用!
本文介绍了Java反射的基本概念、原理及应用场景。反射允许程序在运行时动态获取类的信息并操作其属性和方法,广泛应用于开发框架、动态代理和自定义注解等领域。通过反射,可以实现更灵活的代码设计,但也需注意其性能开销。
92 1
|
4月前
|
安全 Java 测试技术
最佳实践:通义灵码生成单元测试,让单测更简单
本文首先讲述了什么是单元测试、单元测试的价值、一个好的单元测试所具备的原则,进而引入如何去编写一个好的单元测试,通义灵码是如何快速生成单元测试的。
|
5月前
|
缓存 负载均衡 Dubbo
Dubbo技术深度解析及其在Java中的实战应用
Dubbo是一款由阿里巴巴开源的高性能、轻量级的Java分布式服务框架,它致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
144 6

热门文章

最新文章