《Java工程师必读手册》——Java单元测试系列——Java单元测试技巧之编写流程(4)

简介: 《Java工程师必读手册》——Java单元测试系列——Java单元测试技巧之编写流程(4)

五、 注入依赖对象

 

当模拟完这些类成员对象后,我们需要把这些类成员对象注入到被测试类的实例中。以便在调用被测试方法时,可能使用这些类成员对象,而不至于抛出空指针异常。

 

1. 利用Setter方法注入

 

如果类定义了Setter方法,可以直接调用方法设置字段值。

 

image.png 

 

2. 利用ReflectionTestUtils.setField方法注入

 

JUnit提供ReflectionTestUtils.setField方法设置属性字段值。

 

image.png 

 

3. 利用Whitebox.setInternalState方法注入

 

PowerMock提供Whitebox.setInternalState方法设置属性字段值。

 

image.png 

 

4. 利用@InjectMocks注解注入

 

@InjectMocks注解用来创建一个实例,并将其它对象(@Mock、@Spy或直接定义的对象)注入到该实例中。@InjectMocks注解需要配合@RunWith注解使用。

 

image.png 

 

5. 设置静态常量字段值

 

有时候,我们需要对静态常量对象进行模拟,然后去验证是否执行了对应分支下的方法。比如:需要模拟Lombok的@Slf4j生成的log静态常量。但是,Whitebox.setInternalState方法和@InjectMocks注解并不支持设置静态常量,需要自己实现一个设置静态常量的方法:

 

image.png 

 

具体使用方法如下:

 

image.png 

 

注意

经过测试,该方法对于int、Integer等基础类型并不生效,应该是编译器常量优化导致。

 

六、 模拟依赖方法

 

在模拟完依赖的参数和返回值后,就可以利用Mockito和PowerMock的功能,进行依赖方法的模拟。如果依赖对象还有方法调用,还需要模拟这些依赖对象的方法。

 

 

1. 根据返回模拟方法

 

1) 模拟无返回值方法

 

image.png

 

2) 模拟方法单个返回值

 

image.png

 

3) 模拟方法多个返回值

 

直接列举出多个返回值:

 

image.png 

 

转化列表为多个返回值:

 

image.png 

 

4) 模拟方法定制返回值

 

可利用Answer定制方法返回值:

 

image.png

 

 

 

5) 模拟方法抛出单个异常

 

指定单个异常类型:

 

 image.png

 

指定单个异常对象:

 

image.png

 

6) 模拟方法抛出多个异常

 

指定多个异常类型:

 

image.png

 

指定多个异常对象:

 

image.png

 

7) 直接调用真实方法

 

image.png 

 

2. 根据参数模拟方法

 

Mockito提供do-when语句和when-then语句模拟方法。

 

1) 模拟无参数方法

 

对于无参数的方法模拟:

 

image.png 

 

2) 模拟指定参数方法

 

对于指定参数的方法模拟:

 

image.png 

 

3) 模拟任意参数方法

 

在编写单元测试用例时,有时候并不关心传入参数的具体值,可以使用Mockito参数匹配器的any方法。Mockito提供了anyInt、anyLong、anyString、anyList、anySet、anyMap、any(Class<T> clazz)等方法来表示任意值。

 

image.png 

 

4) 模拟可空参数方法

 

Mockito参数匹配器的any具体方法,并不能够匹配null对象。而Mockito提供一个nullable方法,可以匹配包含null对象的任意对象。此外,Mockito.any()方法也可以用来匹配可空参数。

 

image.png 

 

5) 模拟必空参数方法

 

同样,如果要匹配null对象,可以使用isNull方法,或使用eq(null)。

 

image.png 

 

 

6) 模拟不同参数方法

 

Mockito支持按不同的参数分别模拟同一方法。

 

image.png

 

注意

如果一个参数满足多个模拟方法条件,会以最后一个模拟方法为准。

 

7) 模拟可变参数方法

 

对于一些变长度参数方法,可以按实际参数个数进行模拟:

 

image.png 

 

也可以用Mockito.any()模拟一个通用匹配方法

 

image.png 

 

注意

Mockito.<T>any()并不等于Mockito.any(Class<T> type)前者可以匹配null和类型T的可变参数,后者只能匹配T必填参数。

相关文章
|
10月前
|
前端开发 Java API
2025 年 Java 全栈从环境搭建到项目上线实操全流程指南:Java 全栈最新实操指南(2025 版)
本指南涵盖2025年Java全栈开发核心技术,从JDK 21环境搭建、Spring Boot 3.3实战、React前端集成到Docker容器化部署,结合最新特性与实操流程,助力构建高效企业级应用。
2995 1
|
10月前
|
消息中间件 Java Kafka
Java 事件驱动架构设计实战与 Kafka 生态系统组件实操全流程指南
本指南详解Java事件驱动架构与Kafka生态实操,涵盖环境搭建、事件模型定义、生产者与消费者实现、事件测试及高级特性,助你快速构建高可扩展分布式系统。
463 7
|
10月前
|
消息中间件 Java 数据库
Java 基于 DDD 分层架构实战从基础到精通最新实操全流程指南
本文详解基于Java的领域驱动设计(DDD)分层架构实战,结合Spring Boot 3.x、Spring Data JPA 3.x等最新技术栈,通过电商订单系统案例展示如何构建清晰、可维护的微服务架构。内容涵盖项目结构设计、各层实现细节及关键技术点,助力开发者掌握DDD在复杂业务系统中的应用。
1841 0
|
12月前
|
自然语言处理 前端开发 Java
JBoltAI 框架完整实操案例 在 Java 生态中快速构建大模型应用全流程实战指南
本案例基于JBoltAI框架,展示如何快速构建Java生态中的大模型应用——智能客服系统。系统面向电商平台,具备自动回答常见问题、意图识别、多轮对话理解及复杂问题转接人工等功能。采用Spring Boot+JBoltAI架构,集成向量数据库与大模型(如文心一言或通义千问)。内容涵盖需求分析、环境搭建、代码实现(知识库管理、核心服务、REST API)、前端界面开发及部署测试全流程,助你高效掌握大模型应用开发。
1061 5
|
10月前
|
算法 IDE Java
Java 项目实战之实际代码实现与测试调试全过程详解
本文详细讲解了Java项目的实战开发流程,涵盖项目创建、代码实现(如计算器与汉诺塔问题)、单元测试(使用JUnit)及调试技巧(如断点调试与异常排查),帮助开发者掌握从编码到测试调试的完整技能,提升Java开发实战能力。
882 0
|
10月前
|
Java 编译器
Java 17 Switch表达式:更简洁、更强大的流程控制
Java 17 Switch表达式:更简洁、更强大的流程控制
1159 111
|
10月前
|
JavaScript Java 微服务
现代化 Java Web 在线商城项目技术方案与实战开发流程及核心功能实现详解
本项目基于Spring Boot 3与Vue 3构建现代化在线商城系统,采用微服务架构,整合Spring Cloud、Redis、MySQL等技术,涵盖用户认证、商品管理、购物车功能,并支持Docker容器化部署与Kubernetes编排。提供完整CI/CD流程,助力高效开发与扩展。
1073 64
|
缓存 监控 负载均衡
如何提升 API 性能:来自 Java 和测试开发者的优化建议
本文探讨了如何优化API响应时间,提升用户体验。通过缓存(如Redis/Memcached)、减少数据负载(REST过滤字段或GraphQL精确请求)、负载均衡(Nginx/AWS等工具)、数据压缩(Gzip/Brotli)、限流节流、监控性能(Apipost/New Relic等工具)、升级基础设施、减少第三方依赖、优化数据库查询及采用异步处理等方式,可显著提高API速度。快速响应的API不仅让用户满意,还能增强应用整体性能。
|
10月前
|
JavaScript 安全 前端开发
Java开发:最新技术驱动的病人挂号系统实操指南与全流程操作技巧汇总
本文介绍基于Spring Boot 3.x、Vue 3等最新技术构建现代化病人挂号系统,涵盖技术选型、核心功能实现与部署方案,助力开发者快速搭建高效、安全的医疗挂号平台。
448 3
|
11月前
|
人工智能 Cloud Native Java
Java 技术栈企业级应用开发全流程
本指南通过构建企业级电商系统,全面解析现代化Java技术栈实战应用。涵盖Spring Boot 3、微服务架构、云原生部署、服务治理、监控可观测性及AI集成,助开发者掌握全流程开发技能,打造高效可扩展的企业级应用。
682 0
Java 技术栈企业级应用开发全流程