如何使用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<GenericType>)

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

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

2. Jmockit实践

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

<dependency>

<groupId>org.jmockit</groupId>

<artifactId>jmockit</artifactId>

<version>1.20</version>

<scope>test</scope>

</dependency>

<dependency>

<groupId>org.jmockit</groupId>

<artifactId>jmockit-coverage</artifactId>

<version>1.20</version>

<scope>test</scope>

</dependency>

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>4.11</version>

<scope>test</scope>

</dependency>

2.1 示例1:模拟类

被测试方法如下:

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

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

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

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

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

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

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

new Mockup(类) {

模拟方法{

          控制该方法返回结果

}

}

2.2 示例2:模拟静态方法

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

参考测试代码如下:

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

被测试方法:

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

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

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

参考测试代码如下:

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

private McEventReceiver receiver;

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

new NonStrictExpectations() {

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

    result = 返回结果

}

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

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

被测代码如下:

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

参考测试代码如下:

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

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

被测代码如下:

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

参考测试代码如下:

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

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

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

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

被测方法如下:

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

参考测试代码如下:

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

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

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

【原创】如何使用Jmockit进行单元测试的更多相关文章

  1. 如何使用jmockit进行单元测试

    1. Jmockit简介 JMockit 是用以帮助开发人员编写测试程序的一组工具和API,它完全基于 Java 5 SE 的 java.lang.instrument 包开发,内部使用 ASM 库来 ...

  2. 单元测试系列:Mock工具Jmockit使用介绍

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6760272.html Mock工具Jm ...

  3. 单元测试系列之十一:Jmockit之mock特性详解

    本文是Jmockit学习过程中,根据官网所列的工具特性进行解读. 1.调用次数约束(Invocation count constraints) 可以通过调用计数约束来指定预期和/或允许匹配给定期望的调 ...

  4. 单元测试系列之二:Mock工具Jmockit实战

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6760272.html Mock工具Jm ...

  5. 单元测试系列:Mock工具之Mockito实战

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6780719.html 在实际项目中写单 ...

  6. 单元测试系列之五:Mock工具之Mockito实战

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6780719.html 在实际项目中写单 ...

  7. 单元测试系列之十:Sonar 常用代码规则整理(二)

    摘要:帮助公司部署了一套sonar平台,经过一段时间运行,发现有一些问题出现频率很高,因此有必要将这些问题进行整理总结和分析,避免再次出现类似问题. 作者原创技术文章,转载请注明出处 ======== ...

  8. 单元测试系列之九:Sonar 常用代码规则整理(一)

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 摘要:公司部署了一套sonar,经过一段时间运行,发现有一些问题出现频率很高,因此有必要将这些问题进行整理总结和分 ...

  9. 单元测试系列之八:Sonar 数据库表关系整理一(续)

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 简介:Sonar平台是目前较为流行的静态代码扫描平台,为了便于使用以及自己二次开发,有必要对它的数据库结构进行学习 ...

随机推荐

  1. 4.5&4.7联考题解

    本来想加个密码的,后来一想全HE就咱们这几个人,外省的dalao愿看也没事儿,就公开算了,省得加密码各种麻烦. 先补这两天的题解吧……如果有空的话我可能会把上次联考的题解补上= =(中午没睡觉,现在困 ...

  2. JavaScript周报#185

    This week’s JavaScript news Read this issue on the Web | Issue Archive JavaScript Weekly Issue 185Ju ...

  3. \n\r 转义字符

    转义字符 意义 ASCII码值(十进制) \a 响铃(BEL) 007 \b 退格(BS) ,将当前位置移到前一列 008 \f 换页(FF),将当前位置移到下页开头 012 \n 换行(LF) ,将 ...

  4. bootstrap 中的 iCheck 全选反选功能的实现

    喜欢bootstrap 风格的同学应该知道,iCheck的样式还是很好看的. 官网: http://www.bootcss.com/p/icheck/ 进入正题,iCheck提供了一些方法,可以进行全 ...

  5. Socket for android 简单实例

    最近在实现socket通信,所以写个demo来简单实现下.我用了一种是原始的socket实现,另一种是MINA框架来实现的. 下载demo:http://download.csdn.net/detai ...

  6. 提示"libc.so.6: version `GLIBC_2.14' not found"

    启动php 提示"libc.so.6: version `GLIBC_2.14' not found",原因可能是glibc版本太低,php使用了较高的glibc版本引起的 1,首 ...

  7. MVC中异常: An exception of type 'System.Data.ProviderIncompatibleException' occurred in EntityFramework.dll的一种解决办法

    今天在调试MVC的例子的时候,总是出错(An exception of type 'System.Data.ProviderIncompatibleException' occurred in Ent ...

  8. 类型“Microsoft.Office.Interop.Word.ApplicationClass”错误 4317 无法嵌入互操作类型

    类型“Microsoft.Office.Interop.Word.ApplicationClass”错误 4317 无法嵌入互操作类型“Microsoft.Office.Interop.Word.Ap ...

  9. aspnetcore 认证相关类简要说明二

    能过<aspnetcore 认证相关类简要说明一>我们已经了解如何将AuthenticationOptions注入到我们依赖注入系统.接下来,我们将了解一下IAuthenticationS ...

  10. 详解CATransformLayer

    详解CATransformLayer CATransformLayer与CALayer有着细微的差别,但这些差别会影响到3D变换的动画效果. 动画都有坐标系,如下所示(注意,这个不是iOS中的坐标系, ...