powermockito测试私有方法_如何使用 JMockit 进行单元测试
·

点击上方“蓝字”关注我们
作者 | 李卓编辑 | 张婵JMockit 简介JMockit 是用以帮助开发人员编写测试程序的一组工具和 API,是一款 Java 类/接口/对象的 Mock 工具,目前广泛应用于 Java 应用程序的单元测试中。它完全基于 Java 5 SE 的 java.lang.instrument 包开发,内部使用 ASM 库来修改 Java 的 Bytecode。正是由于基于 instrument,可以修改字节码,这样便可以使得 JMockit 能够适应几乎所有的设计,所以这也是它强大的原因。 在测试单元中被调用的方法或构造函数,以及被依赖到的单元通常都是模拟的对象。Mocking 提供了一种机制,使得那些被测试的单元可以与他依赖的单元孤立开来。我们声明某个对象为 mocked类型来指定在本测试中该依赖的对象是模拟的。JMockit 可以 mock 的种类包含了:class(abstract, final, static)
interface
enum
annotation
native
Behavior-oriented(Expectations & Verifications)
State-oriented(MockUp)
org.jmockitjmockit1.20testorg.jmockitjmockit-coverage1.20testjunitjunit4.11test
示例1:模拟类
被测试方法如下:
其中 NegativeTransDos 的 insert 方法是插入数据库。 为了测试 process() 方法的逻辑,希望能够模拟 dao.insert 方法的返回结果,参考测试代码如下:
可以看到使用 JMockit 基本有三个步骤:
打桩。指定要打桩类和函数,模拟返回结果。这里是 new Mockup(NegativeTransDos)。
调用被测方法。被测逻辑执行过程中,之前的打桩数据生效。
判断测试结果是否符合预期。
通过以下方法来模拟类和方法。
newMockup(类){模拟方法{控制该方法返回结果}}
示例2:模拟静态方法
参考测试代码如下:
示例3:模拟非静态方法
被测试方法:
这里包括两种方法的模拟:McEventManager.getReceiver(),这个是静态方法调用的模拟,参考 示例1 章节。receiver.getEvent(),这个是普通对象方法调用。本节关注这种方法的模拟。 参考测试代码如下:
首先需要通过 @Injectable 声明要插桩的对象:private McEventReceiver receiver; 之后使用以下方式来插桩:newNonStrictExpectations(){要模拟的方法(参数1,参数2,…)result =返回结果}

示例4:模拟 private 静态方法
publicMethod() 是被测试方法,其中调用了静态成员方法 privateMethod。为了摒除 privateMethod 的影响,需要模拟它的返回结果。 参考测试代码如下:
test1 和 test2 的输出结果分别是:
示例5:模拟 private 非静态方法
publicMethod() 是被测试方法,其中调用了私有非静态成员方法 privateMethod。为了摒除 privateMethod 的影响,需要模拟它的返回结果。 参考测试代码如下:
对比私有静态方法的模拟可以看到略有区别。new Expectations(XXX) 中,之前指定的是 MockClass.class,这里指定的是被测试的MockClass 对象。 test1 和 test2 的输出结果分别是:
示例6:模拟 private 非静态成员变量
其中 field 是 MockField 的私有变量。我们目的是能够模拟该私有变量的值,来关注publicMethod 方法的测试。 参考测试代码如下:
test1 和 test2 的输出结果分别是:
示例7:模拟 private 静态成员变量
示例8:模拟类的构造函数
为了测试异常,模拟 FileOutputStream 的构造函数,抛出 FileNotFoundException。如下:
总结本文简要介绍了 JMockit 这款广泛应用于 Java 应用程序的单元测试工具,并通过一些实践示例具体展示了模拟类、模拟静态方法、模拟非静态方法、模拟 Private 静态方法、模拟 Private 非静态方法、模拟 Private 非静态成员变量、模拟 Private 静态成员变量、模拟类的构造函数这几种情况下 JMockit 的使用方法,希望能对软件开发中的测试工作有所帮助。


猜你喜欢
建信金科北京事业群政融支付项目组敏捷实践心得移动金融类 APP 自动化测试平台技术揭秘那些年,我在项目中遇到过的不靠谱同事政务产品如何让更多人爱用?产品信息无障碍设计初探
更多推荐
所有评论(0)