zoukankan      html  css  js  c++  java
  • 使用Powermock进行单元测试,以及常见问题的处理

    1. 引言

    在进行单元测试时,经常遇到被测方法依赖外部对象和环境,如需要数据库连接,网络通信依赖等,需要进行大量的初始化工作,这时可以采用powermock+mockito对被测对象进行模拟,通过录放的形式解决此类问题。

    Mockito 是一个针对 Java 的单元测试模拟框架,它与 EasyMock 和 jMock 很相似,都是为了简化单元测试过程中测试上下文 ( 或者称之为测试驱动函数以及桩函数 ) 的搭建而开发的工具。

    PowerMock 也是一个单元测试模拟框架,它是在其它单元测试模拟框架的基础上做出的扩展。通过提供定制的类加载器以及一些字节码篡改技巧的应用,PowerMock 现了对静态方法、构造方法、私有方法以及 Final 方法的模拟支持,对静态初始化过程的移除等强大的功能。

    2. 使用实例

    模拟接口返回

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

    InterfaceToMock mock = Powermockito.mock(InterfaceToMock.class)

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

    Powermockito.when(mock.method(Params..)).thenThrow(Exception)

    设置对象的private属性

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

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

    Whitebox.setInternalState(Object object, String fieldname, Object… value);

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

    模拟构造函数

    注意解决出现的@PowerMockIgnore("javax.management.*")问题

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

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

    @RunWith(PowerMockRunner.class)

    @PrepareForTest({ InstanceClass.class })

    @PowerMockIgnore("javax.management.*")

    Powermockito.whenNew(InstanceClass.class).thenReturn(Object value)

    模拟静态方法

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

    @RunWith(PowerMockRunner.class)

    @PrepareForTest({ StaticClassToMock.class })

    @PowerMockIgnore("javax.management.*")

    Powermockito.mockStatic(StaticClassToMock.class);

    Powermockito.when(StaticClassToMock.method(Object.. params)).thenReturn(Object value)

    模拟final方法

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

    @RunWith(PowerMockRunner.class)

    @PrepareForTest({ FinalClassToMock.class })

    @PowerMockIgnore("javax.management.*")

    Powermockito.mockStatic(FinalClassToMock.class);

    Powermockito.when(StaticClassToMock.method(Object.. params)).thenReturn(Object value)

    模拟静态类

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

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

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

    1)  PowerMockito.spy(TargetClass.class);

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

    3)  注意加入

    @RunWith(PowerMockRunner.class)

    @PrepareForTest(DisplayMoRelationBuilder.class)

    @PowerMockIgnore("javax.management.*")

    参数匹配器

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

    如:

    Mockito.anyInt(),Mockito.anyString()

    处理public void型的静态方法

    Powermockito.doNothing.when(T class2mock, String method, <T>… params>

    3.常见问题

    使用Powermock后会提示classloader错误

    加入注解:

    @PowerMockIgnore("javax.management.*")

    Eclipse + junit4 + Emma 无法统计覆盖率情况

    Emma问题导致,暂无处理方法。

    使用Ant和HUTAF_LLT覆盖率插件出现的覆盖率无法统计情况

    原因是对被统计类使用了PrepareForTest()注解,去掉该注解,不再进行被测类方法进行mock.

  • 相关阅读:
    Servlet Filter过滤器执行顺序
    eclipse乱码问题
    如何查看servlet&jsp版本?
    Unity的shader学习2
    Unity的shader学习1
    后缀数组专题与代码模板
    哈希表/散列表 指针版模版
    图的连通性专题及模板
    一般图最大匹配--带花树
    7-15至7-17训练赛回顾
  • 原文地址:https://www.cnblogs.com/jiyuqi/p/3564621.html
Copyright © 2011-2022 走看看