前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用PowerMock进行单元测试

使用PowerMock进行单元测试

作者头像
Dream城堡
发布2022-01-07 17:25:00
3K0
发布2022-01-07 17:25:00
举报
文章被收录于专栏:Spring相关Spring相关

单元测试可以提高测试开发的效率,减少代码错误率,提高代码健壮性,提高代码质量。在Spring框架中常用的两种测试框架:PowerMockRunner和SpringRunner两个单元测试,鉴于SpringRunner启动的一系列依赖和数据连接的问题,推荐使用PowerMockRunner,这样能有效的提高测试的效率,并且其提供的API能覆盖的场景广泛,使用方便,可谓是Java单元测试之模拟利器。

1. PowerMock是什么?

PowerMock是一个Java模拟框架,可用于解决通常认为很难甚至无法测试的测试问题。使用PowerMock,可以模拟静态方法,删除静态初始化程序,允许模拟而不依赖于注入,等等。PowerMock通过在执行测试时在运行时修改字节码来完成这些技巧。PowerMock还包含一些实用程序,可让您更轻松地访问对象的内部状态。

举个例子,你在使用Junit进行单元测试时,并不想让测试数据进入数据库,怎么办?这个时候就可以使用PowerMock,拦截数据库操作,并模拟返回参数。

2. PowerMock包引入
代码语言:javascript
复制
<!-- 单元测试 依赖-->
        <dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-core</artifactId>
            <version>2.0.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
            <version>2.23.0</version>
        </dependency>
        <dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-module-junit4</artifactId>
            <version>2.0.4</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-api-mockito2</artifactId>
            <version>2.0.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.github.jsonzou</groupId>
            <artifactId>jmockdata</artifactId>
            <version>4.3.0</version>
        </dependency>
        <!-- 单元测试 依赖-->
3. 重要注解说明
代码语言:javascript
复制
@RunWith(PowerMockRunner.class) // 告诉JUnit使用PowerMockRunner进行测试
@PrepareForTest({RandomUtil.class}) // 所有需要测试的类列在此处,适用于模拟final类或有final, private, static, native方法的类
@PowerMockIgnore("javax.management.*") //为了解决使用powermock后,提示classloader错误
4. 使用示例
4.1 模拟接口返回

首先对接口进行mock,然后录制相关行为

代码语言:javascript
复制
InterfaceToMock mock = Powermockito.mock(InterfaceToMock.class)

Powermockito.when(mock.method(Params…)).thenReturn(value)

Powermockito.when(mock.method(Params..)).thenThrow(Exception)
4.2 设置对象的private属性

需要使用whitebox向class或者对象中赋值。

如我们已经对接口尽心了mock,现在需要将此mock加入到对象中,可以采用如下方法:

代码语言:javascript
复制
Whitebox.setInternalState(Object object, String fieldname, Object… value);

其中object为需要设置属性的静态类或对象。

4.3 模拟构造函数

对于模拟构造函数,也即当出现new InstanceClass()时可以将此构造函数拦截并替换结果为我们需要的mock对象。

注意:使用时需要加入标记:

代码语言:javascript
复制
@RunWith(PowerMockRunner.class)

@PrepareForTest({ InstanceClass.class })

@PowerMockIgnore("javax.management.\*")

Powermockito.whenNew(InstanceClass.class).thenReturn(Object value)
4.4 模拟静态方法

模拟静态方法类似于模拟构造函数,也需要加入注释标记。

代码语言:javascript
复制
@RunWith(PowerMockRunner.class)

@PrepareForTest({ StaticClassToMock.class })

@PowerMockIgnore("javax.management.\*")

Powermockito.mockStatic(StaticClassToMock.class);

Powermockito.when(StaticClassToMock.method(Object.. params)).thenReturn(Object value)
4.5 模拟final方法

Final方法的模拟类似于模拟静态方法。

代码语言:javascript
复制
@RunWith(PowerMockRunner.class)

@PrepareForTest({ FinalClassToMock.class })

@PowerMockIgnore("javax.management.\*")

Powermockito.mockStatic(FinalClassToMock.class);

Powermockito.when(StaticClassToMock.method(Object.. params)).thenReturn(Object value)
4.6 模拟静态类

模拟静态类类似于模拟静态方法。

4.7 使用spy方法避免执行被测类中的成员函数

如被测试类为:TargetClass,想要屏蔽的方法为targetMethod.

代码语言:javascript
复制
1) PowerMockito.spy(TargetClass.class);

2) Powemockito.when(TargetClass.targetMethod()).doReturn()

3) 注意加入

@RunWith(PowerMockRunner.class)

@PrepareForTest(DisplayMoRelationBuilder.class)

@PowerMockIgnore("javax.management.*")
4.8 参数匹配器

有时我们在处理doMethod(Param param)时,不想进行精确匹配,这时可以使用Mockito提供的模糊匹配方式。

如:Mockito.anyInt(),Mockito.anyString()

4.9 处理public void型的静态方法
代码语言:javascript
复制
Powermockito.doNothing.when(T class2mock, String method, <T>… params>
5. 单元测试用例可选清单
  • 5.1 输入数据验证: 本节包含了一系列检查,这些检查通常可以对输入到应用程序系统中的数据采用。
    • 必传项测试
    • 唯一字段值测试
    • 空值测试
    • 字段只接受允许的字符
    • 负值测试
    • 字段限于字段长度规范
    • 不可能的值
    • 垃圾值测试
    • 检查字段之间的依赖性
    • 等效类划分和边界条件测试
    • 错误和异常处理测试

    5.2 日期验证: 这构成了日期字段的一组条件。

    • 各种日期格式
    • 美式风格的日期格式
    • 有效日期
    • 无效的日期,例如
    • 月份00和13
    • Day不包含00和32作为其值
    • 28、29、30已正确验证
    • 检查周末和银行假期的影响
    • 年与2月29日之间的链接

    5.3 时间验证: 这构成了时间字段的一组条件

    • 各种时间格式,例如12/24小时格式,AM / PM
    • 检查有效时间
    • 检查无效时间
    • 检查周末和工作假期的影响

    5.4 邮政编码验证: 这构成了邮政编码字段的一组条件

    • 测试部分邮政编码输入并检查邮政编码格式
    • 测试空间/无空间
    • 检查是否有手动输入地址的选项

    5.5 系统接口: 这构成了在多个应用程序系统之间传输的字段的一组条件。

    • 检查接口上的所有字段/参数是否正确执行
    • 所有数据字段都需要按照验证列表正常工作
    • 跨自动化接口的安全性测试
    • 检查继承关系

    5.6 可用性: 这构成一组条件,有助于验证应用程序系统的可用性。

    • 检查布局是否与设计标准一致
    • 检查字体,颜色,大小等。
    • 测试品牌准则
    • 检查每个应用程序的窗口标题是否都有应用程序的名称和窗口名称
    • 检查对齐
    • 检查屏幕是否可调整大小和最小化
    • 拼写检查
    • 必要时测试默认值
    • 必填字段需要用星号符号突出显示

    5.7 安全: 这构成一组条件,有助于验证应用程序系统的安全性。

    • 密码不可见
    • 访问测试-多个级别
    • 更改密码
    • 错误消息不应泄露任何系统信息
    • 检查是否正确部署了SSL
    • 检查是否应用了锁定规则
    • 检查密码是否以明码或加密方式保存
    • 使用有效的UserId和无效的UserId验证应用程序
    • 使用有效密码和各种无效密码验证应用程序
    • 通过直接输入有效的URL来检查对应用程序的访问。系统应询问登录详细信息。
    • 确保浏览器不记得密码

    5.8 记录,审核和跟踪: 这由一组条件组成,这些条件有助于验证应用程序系统的审核记录,系统日志等。

    • 检查是否在指定时间段内保存了日志
    • 检查日志中是否包含个人数据
    • 检查是否记录了管理员功能
    • 检查是否记录了用户锁定事件

    5.9 业务应用程序逻辑: 这构成一组条件,有助于验证应用程序系统的应用程序逻辑和业务处理。

    • 检查是否探索了所有可用产品的选项
    • 检查所有升级和降级路径及选项
    • 验证升级和降级已应用于计费,网络,自助等
    • 停止/断开连接/终止行为
    • 设备故障行为
    • 检查计算金额的舍入
    • 确保使用的测试帐户的完整范围,类型/状态/条件
    • 检查是否按要求显示货币符号
    • 验证没有重复的记录。
    • 在涉及算术的情况下,使用大量或非常大的数量/数字,以显示的和实际的数据形式检查溢出

    5.10 报告: 本节包含一组检查,这些检查有助于验证系统提供的报告功能。

    • 所有字段均可用
    • 字段应有足够的空间
    • 启用滚动和平移
    • 页码指示报告大小(N个,共M个),并应允许访问报告中的中/终点
    • 报告已正确导出到Excel / Word文档
    • 报告可以正确打印,所有数据正确显示
    • 检查报告中的所有页面是否都可访问

    5.11 环境: 本节包含一组检查,这些检查有助于验证AUT的环境或设备要求。

    • 使用所有浏览器进行测试
    • 通过启用和禁用Java脚本进行测试

    5.12 电邮: 本节包含一组可用于验证电子邮件功能的检查

    • 验证在发送电子邮件时是否提供确认消息
    • 验证电子邮件中提供的链接是否正常运行
    • 确认回复地址正确
    • 验证电子邮件中的字体,大小和文本对齐是否正确

    5.13 搜索条件: 本节包含对应用程序系统搜索功能的一系列检查。

    • 验证滚动条已实现
    • 验证对齐结果正确无误
    • 验证是否为搜索条件的任意组合显示了有效的结果。
    • 验证是否针对AND / OR条件检索到正确的结果
    • 验证结果以字母顺序或指定顺序显示
    • 验证列标题是否可排序
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-04-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. PowerMock是什么?
  • 2. PowerMock包引入
  • 3. 重要注解说明
  • 4. 使用示例
    • 4.1 模拟接口返回
      • 4.2 设置对象的private属性
        • 4.3 模拟构造函数
          • 4.4 模拟静态方法
            • 4.5 模拟final方法
              • 4.6 模拟静态类
                • 4.7 使用spy方法避免执行被测类中的成员函数
                  • 4.8 参数匹配器
                    • 4.9 处理public void型的静态方法
                    • 5. 单元测试用例可选清单
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档