《Java单元测试实战》——编写方法:Java编程技巧之单元测试用例编写流程(16)

简介: 《Java单元测试实战》——编写方法:Java编程技巧之单元测试用例编写流程(16)

《Java单元测试实战》——编写方法:Java编程技巧之单元测试用例编写流程(15) https://developer.aliyun.com/article/1232403?groupCode=java



十一、 典型案例及解决方案

 

这里,只收集了几个经典案例,解决了特定环境下的特定问题。

 

1. 测试框架特性导致问题

 

在编写单元测试用例时,或多或少会遇到一些问题,大多数是由于对测试框架特性不熟悉导致,比如:

 

Mockito不支持对静态方法、构造方法、final方法、私有方法的模拟;

 

Mockito的any相关的参数匹配方法并不支持可空参数和空参数;

 

采用Mockito的参数匹配方法时,其它参数不能直接用常量或变量,必须使用Mockito的eq方法;

 

使用when-then语句模拟Spy对象方法会先执行真实方法,应该使用do-when语句;

 

PowerMock对静态方法、构造方法、final方法、私有方法的模拟需要把对应的类添加到@PrepareForTest注解中;

 

PowerMock模拟JDK的静态方法、构造方法、final方法、私有方法时,需要把使用这些方法的类加入到@PrepareForTest注解中,从而导致单元测试覆盖率不被统计;

 

PowerMock使用自定义的类加载器来加载类,可能导致系统类加载器认为有类型转换问题;需要加上@PowerMockIgnore({"javax.crypto.*"})注解,来告诉PowerMock这个包不要用PowerMock的类加载器加载,需要采用系统类加载器来加载。

 

对于这些问题,可以根据提示信息查阅相关资料解决,这里就不再累述了。

 

2. 捕获参数值已变更问题

 

在编写单元测试用例时,通常采用ArgumentCaptor进行参数捕获,然后对参数对象值进行验证。如果参数对象值没有变更,这个步骤就没有任何问题。但是,如果参数对象值在后续流程中发生变更,就会导致验证参数值失败。

 

 

原始代码:


image.png


测试用例:

image.png


问题现象:

 

执行单元测试用例失败,抛出以下异常信息:

image.png

问题原因:

 

由于参数dataList在调用dataStorage.test方法后,都被主动调用dataList.clear方法进行清空。由于ArgumentCaptor捕获的是对象引用,所以最后捕获到了同一个空列表。

 

解决方案:

 

可以在模拟依赖方法dataStorage.test时,保存传入参数的当前值进行验证。代码如下:

image.png


3. 模拟Lombok的log对象问题

 

Lombok的@Slf4j注解,广泛地应用于Java项目中。在某些代码分支里,可能只有log记录日志的操作,为了验证这个分支逻辑被正确执行,需要在单元测试用例中对log记录日志的操作进行验证。

 

原始方法:

image.png

测试用例:

image.png


问题现象:

 

执行单元测试用例失败,抛出以下异常信息:

image.png

原因分析:

 

经过调式跟踪,发现ExampleService中的log对象并没有被注入。通过编译发现,Lombok的@Slf4j注解在ExampleService类中生成了一个静态常量log,而@InjectMocks注解并不支持静态常量的注入。

 

解决方案:

 

采用作者实现的FieldHelper.setStaticFinalField方法,可以实现对静态常量的注入模拟对象。

image.png



《Java单元测试实战》——编写方法:Java编程技巧之单元测试用例编写流程(17 https://developer.aliyun.com/article/1232401?groupCode=java

相关文章
|
6天前
|
安全 数据可视化 前端开发
【测试开发】用例篇 · 熟悉黑盒测试用例设计方法(2)· 正交表 · 场景设计 · 常见案例练习
【测试开发】用例篇 · 熟悉黑盒测试用例设计方法(2)· 正交表 · 场景设计 · 常见案例练习
19 0
|
4天前
|
存储 XML 测试技术
深入理解自动化测试中的数据驱动方法
【5月更文挑战第17天】 在软件测试领域,数据驱动测试(DDT)是一种高效的测试方法,它允许测试人员通过外部数据源来控制测试用例的执行。这种方法的核心在于将测试逻辑与测试数据分离,使得测试案例可以简单地通过改变输入数据集来扩展和复用。本文旨在探讨数据驱动测试的原理、实施策略及其在实际项目中的应用效果,以期为读者提供一种提高测试效率和质量的有效手段。
|
5天前
|
Java 测试技术
Java一分钟之-单元测试:JUnit与TestNG
【5月更文挑战第16天】本文介绍了Java常用的单元测试框架JUnit和TestNG,JUnit以其简洁注解受到青睐,而TestNG则提供更高级功能如参数化测试。常见问题包括测试未执行、断言失败等,解决办法包括检查项目配置、调整测试顺序。注意保持测试简单独立,确保高覆盖率。选择合适的框架可提升代码质量。
11 0
|
6天前
|
人工智能 测试技术 数据处理
【测试开发】用例篇 · 熟悉黑盒测试用例设计方法(1)等价类划分法、边界值法、判定表法
【测试开发】用例篇 · 熟悉黑盒测试用例设计方法(1)等价类划分法、边界值法、判定表法
9 0
|
6天前
|
测试技术 iOS开发
pytest Mark标记测试用例
使用`pytest.mark`进行测试用例分组和筛选,如`@pytest.mark.webtest`。通过`pytest -m`参数执行特定标记的用例,例如`pytest -s test_command_param.py -m webtest`。同时,pytest支持内置的skip、skipif和xfail功能来管理特殊用例:skip始终跳过,skipif条件满足时跳过,xfail则标记预期失败的测试。
6 0
|
6天前
探讨AC/DC电源模块的可靠性设计和测试方法
探讨AC/DC电源模块的可靠性设计和测试方法
探讨AC/DC电源模块的可靠性设计和测试方法
|
6天前
BOSHIDA AC/DC电源模块的可靠性设计与测试方法
BOSHIDA AC/DC电源模块的可靠性设计与测试方法
BOSHIDA  AC/DC电源模块的可靠性设计与测试方法
|
6天前
|
网络协议 安全 测试技术
性能工具之emqtt-bench BenchMark 测试示例
【4月更文挑战第19天】在前面两篇文章中介绍了emqtt-bench工具和MQTT的入门压测,本文示例 emqtt_bench 对 MQTT Broker 做 Beachmark 测试,让大家对 MQTT消息中间 BenchMark 测试有个整体了解,方便平常在压测工作查阅。
140 7
性能工具之emqtt-bench BenchMark 测试示例
|
6天前
|
机器学习/深度学习 数据采集 人工智能
【专栏】AI在软件测试中的应用,如自动执行测试用例、识别缺陷和优化测试设计
【4月更文挑战第27天】本文探讨了AI在软件测试中的应用,如自动执行测试用例、识别缺陷和优化测试设计。AI辅助工具利用机器学习、自然语言处理和图像识别提高效率,但面临数据质量、模型解释性、维护更新及安全性挑战。未来,AI将更注重用户体验,提升透明度,并在保护隐私的同时,通过联邦学习等技术共享知识。AI在软件测试领域的前景广阔,但需解决现有挑战。
|
6天前
|
测试技术
如何管理测试用例?测试用例有什么管理工具?YesDev
该文档介绍了测试用例和测试用例库的管理。测试用例是描述软件测试方案的详细步骤,包括测试目标、环境、输入、步骤和预期结果。测试用例库用于组织和管理这些用例,强调简洁性、完整性和可维护性。管理者可以创建、删除、重命名用例库,搜索和管理用例,以及通过层级目录结构来组织用例。此外,还支持通过Excel导入和导出测试用例,以及使用脑图查看用例关系。后台管理允许配置全局别名,如用例状态、优先级和执行结果。