《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必填参数。

相关文章
|
3月前
|
算法 IDE Java
Java 项目实战之实际代码实现与测试调试全过程详解
本文详细讲解了Java项目的实战开发流程,涵盖项目创建、代码实现(如计算器与汉诺塔问题)、单元测试(使用JUnit)及调试技巧(如断点调试与异常排查),帮助开发者掌握从编码到测试调试的完整技能,提升Java开发实战能力。
437 0
|
8月前
|
缓存 监控 负载均衡
如何提升 API 性能:来自 Java 和测试开发者的优化建议
本文探讨了如何优化API响应时间,提升用户体验。通过缓存(如Redis/Memcached)、减少数据负载(REST过滤字段或GraphQL精确请求)、负载均衡(Nginx/AWS等工具)、数据压缩(Gzip/Brotli)、限流节流、监控性能(Apipost/New Relic等工具)、升级基础设施、减少第三方依赖、优化数据库查询及采用异步处理等方式,可显著提高API速度。快速响应的API不仅让用户满意,还能增强应用整体性能。
|
4月前
|
安全 Java 测试技术
Java 项目实战中现代技术栈下代码实现与测试调试的完整流程
本文介绍基于Java 17和Spring技术栈的现代化项目开发实践。项目采用Gradle构建工具,实现模块化DDD分层架构,结合Spring WebFlux开发响应式API,并应用Record、Sealed Class等新特性。测试策略涵盖JUnit单元测试和Testcontainers集成测试,通过JFR和OpenTelemetry实现性能监控。部署阶段采用Docker容器化和Kubernetes编排,同时展示异步处理和反应式编程的性能优化。整套方案体现了现代Java开发的最佳实践,包括代码实现、测试调试
208 0
|
4月前
|
人工智能 Java 测试技术
Java or Python?测试开发工程师如何选择合适的编程语言?
测试工程师如何选择编程语言?Java 还是 Python?多位资深专家分享建议:Python 入门简单、开发效率高,适合新手及自动化测试;Java 生态成熟,适合大型项目和平台开发。建议结合公司技术栈、个人基础及发展方向选择。长远来看,两者兼通更佳,同时关注 Go 等新兴语言。快速学习与实践才是关键。
|
测试技术 开发者 UED
探索软件测试的深度:从单元测试到自动化测试
【10月更文挑战第30天】在软件开发的世界中,测试是确保产品质量和用户满意度的关键步骤。本文将深入探讨软件测试的不同层次,从基本的单元测试到复杂的自动化测试,揭示它们如何共同构建一个坚实的质量保证体系。我们将通过实际代码示例,展示如何在开发过程中实施有效的测试策略,以确保软件的稳定性和可靠性。无论你是新手还是经验丰富的开发者,这篇文章都将为你提供宝贵的见解和实用技巧。
|
Java 测试技术 Maven
Java一分钟之-PowerMock:静态方法与私有方法测试
通过本文的详细介绍,您可以使用PowerMock轻松地测试Java代码中的静态方法和私有方法。PowerMock通过扩展Mockito,提供了强大的功能,帮助开发者在复杂的测试场景中保持高效和准确的单元测试。希望本文对您的Java单元测试有所帮助。
1878 2
|
Java 程序员 测试技术
Java|让 JUnit4 测试类自动注入 logger 和被测 Service
本文介绍如何通过自定义 IDEA 的 JUnit4 Test Class 模板,实现生成测试类时自动注入 logger 和被测 Service。
237 5
|
XML JSON 前端开发
阿里云JAVA高级测试试题及答案(十二)
阿里云JAVA高级测试试题及答案
334 0
阿里云JAVA高级测试试题及答案(十一)
阿里云JAVA高级测试试题及答案
281 0
|
XML 缓存 druid
阿里云JAVA高级测试试题及答案(十)
阿里云JAVA高级测试试题及答案
359 0