目录

jmockit教程_原创如何使用Jmockit进行单元测试

目录

jmockit教程_【原创】如何使用Jmockit进行单元测试

如何使用jmockit进行单元测试

  1. Jmockit简介

JMockit 是用以帮助开发人员编写测试程序的一组工具和API,它完全基于 Java 5 SE 的 java.lang.instrument 包开发,内部使用 ASM 库来修改Java的Bytecode。正是由于基于instrument,可以修改字节码。所以这也是它强大的原因。

Jmockit可以mock的种类包含了:

  1. class(abstract, final, static)

  2. interface

  3. enum

  4. annotation

  5. native

Jmockit 有两种mock的方式:

  1. Behavior-oriented(Expectations & Verifications)

  2. State-oriented(MockUp)

通俗点讲,Behavior-oriented是基于行为的mock,对mock目标代码的行为进行模仿,更像黑盒测试。State-oriented 是基于状态的mock,是站在目标测试代码内部的。可以对传入的参数进行检查、匹配,才返回某些结果,类似白盒。而State-oriented的 new MockUp基本上可以mock任何代码或逻辑。非常强大。

(这段介绍来自网络转载)

  1. Jmockit实践

使用jMockit首先要引用相关的jar包,pom文件引用如下.

org.jmockit

jmockit

1.20

test

org.jmockit

jmockit-coverage

1.20

test

junit

junit

4.11

test

2.1 示例1:模拟类

被测试方法如下:

https://i-blog.csdnimg.cn/blog_migrate/01f283361929bd890dfd8b9ad97a0bc6.png

其中NegativeTransDos的insert方法是插入数据库。

为了测试process()方法的逻辑,希望能够模拟dao.insert方法的返回结果,参考测试代码如下:

https://i-blog.csdnimg.cn/blog_migrate/4343974a568f088b52fe57ccd20e776f.png

可以看到使用jmockit基本有三个步骤:

(1)打桩。指定要打桩类和函数,模拟返回结果。这里是new Mockup(NegativeTransDos)。

(2)调用被测方法。被测逻辑执行过程中,之前的打桩数据生效。

(3)判断测试结果是否符合预期。

通过以下方法来模拟类和方法。

new Mockup(类) {

模拟方法{

控制该方法返回结果

}

}

2.2 示例2:模拟静态方法

被测试方法如下。其中红框是需要Mock的两个静态方法。通过Jmockit模拟这两个静态方法的返回,只关注EdaStartup方法的自身逻辑。

https://i-blog.csdnimg.cn/blog_migrate/cf2b6064594c8392b6e2af1b16bc7eb0.png

参考测试代码如下:

https://i-blog.csdnimg.cn/blog_migrate/07e82965c181a420621c74bc46aa9f0e.png

2.3 示例3:模拟非静态方法

被测试方法:

https://i-blog.csdnimg.cn/blog_migrate/c6afd86975370130c8ca0731b9b31600.png

这里包括两种方法的模拟:

McEventManager.getReceiver(),这个是静态方法调用的模拟,参考2.1章节。

receiver.getEvent(),这个是普通对象方法调用。本节关注这种方法的模拟。

参考测试代码如下:

https://i-blog.csdnimg.cn/blog_migrate/3ec0872850290bb5dff28e2eb1d37279.png

首先需要通过 @Injectable 声明要插桩的对象:

private McEventReceiver receiver;

之后使用以下方式来插桩:

new NonStrictExpectations() {

要模拟的方法(参数1,参数2,…)

result = 返回结果

}

Jmockit提供了很彪悍的万能入参,这一点非常方便。包括:

https://i-blog.csdnimg.cn/blog_migrate/624762db9bfe2cf81357a9fde73ada93.png

2.4 示例4:模拟private静态方法

被测代码如下:

https://i-blog.csdnimg.cn/blog_migrate/bb42efda4d9dc63000275fc4c690317b.png

publicMethod()是被测试方法,其中调用了静态成员方法privateMethod。为了摒除privateMethod的影响,需要模拟它的返回结果。

参考测试代码如下:

https://i-blog.csdnimg.cn/blog_migrate/73a8b6700fb7b61dd4742da086ed6655.png

test1和test2的输出结果分别是:

https://i-blog.csdnimg.cn/blog_migrate/5166e0a484eea2c6750442cac5d38929.png

2.5 示例5:模拟private非静态方法

被测代码如下:

https://i-blog.csdnimg.cn/blog_migrate/859d4c7c662661a1fe2a910e416264fa.png

publicMethod()是被测试方法,其中调用了私有非静态成员方法privateMethod。为了摒除privateMethod的影响,需要模拟它的返回结果。

参考测试代码如下:

https://i-blog.csdnimg.cn/blog_migrate/618961ed1d18d248817c4aeffaa0e048.png

对比2.5私有静态方法的模拟可以看到略有区别。

new Expectations(XXX) 中,之前指定的是MockClass.class,这里指定的是被测试的MockClass对象。

test1和test2的输出结果分别是:

https://i-blog.csdnimg.cn/blog_migrate/806f83feff671db57b6e263f8232edff.png

2.6 示例6:模拟private非静态成员变量

被测方法如下:

https://i-blog.csdnimg.cn/blog_migrate/9f81a359f424c45f5702d852a9c573d3.png

其中field是MockField的私有变量。我们目的是能够模拟该私有变量的值,来关注publicMethod方法的测试。

参考测试代码如下:

https://i-blog.csdnimg.cn/blog_migrate/a4b8dce5c1173fc52fbe2c8c4c10d1e9.png

test1和test2的输出结果分别是:

https://i-blog.csdnimg.cn/blog_migrate/ed8c99d6466c83ef239dae717e81fce0.png

2.7 示例7:模拟private静态成员变量

类似2.6节非静态成员变量的模拟,参考2.4和2.5的区别。示例略。