浅谈Jmockit使用
转自http://blog.csdn.net/changsu4615/article/details/46802517。如有疑问请联系我删除。
最近公司里要求使用Jmockit来辅助单元测试。之前也没接触过,研究了几天,今天就跟大家谈谈我怎么使用Jmockit。写一个小例子供大家参考。
如有不对的地方还请大家多多指正
对于Mock的作用这里就不详细介绍了,不清楚的可以自行百度。笔者使用的是1.15版本的Jmockit(默认读者已经把相应的包导好)
在开始测试之前我们先写一个简单的Java类,代码如下
- public class GetServiceForBook {
- public int getService(String bookType) {
- if ("novel".equals(bookType)){
- return 1;
- }
- else {
- return 2;
- }
- }
- }
以上是一个极其简单的一个Java类,里面定义了一个getService方法。看了这个方法后可以确定,调用这个方法后得到的结果不是1就2.下面我们就来写一个小单元测试。
- import static org.junit.Assert.*;
- import org.junit.Test;
- public class GetServiceForBookTest {
- private GetServiceForBook getServiceForBook = new GetServiceForBook();
- @Test
- public void testBookService() {
- int test = getServiceForBook.getService("novel");
- assertEquals(1,test);
- }
- }
对于上面的单元测试我相信不会有人看不懂,而且简单运行一下就是一个长长的绿条。那下面我们就开始使用Mock来“修改”我们的GetServiceForBook类。
刚刚也说明了,对于getService方法的返回值不是1就是2。那如果我想让getService返回3怎么办?很简单,使用Mock。先上Expectations的方式。
- import static org.junit.Assert.*;
- import mockit.Expectations;
- import mockit.Injectable;
- import org.junit.Test;
- public class GetServiceForBookTest {
- @Injectable
- private GetServiceForBook getServiceForBook;
- @Test
- public void testBookService() {
- new Expectations(){
- {
- getServiceForBook.getService(anyString);
- result = 3;
- times = 1;
- }
- };
- int test = getServiceForBook.getService("novel");
- assertEquals(3,test);
- }
- }
以上就是使用Mock的方式把getService方法给“修改”了。所以底下的断言是看test和3的比较。很明显,这里用了Expectations把getService的返回值改成了3,也就是说在这个测试里不论我传进去的参数是什么,它的返回都是3.(使用@Injectable系统会自动注入,创建实例。)下面在给一个使用MockUp方式
- import static org.junit.Assert.*;
- import mockit.Mock;
- import mockit.MockUp;
- import org.junit.Test;
- public class GetServiceForBookTest {
- private GetServiceForBook getServiceForBook = new GetServiceForBook();
- @Test
- public void testBookService() {
- new MockUp<GetServiceForBook>(){
- @Mock
- public int getService(String bookType)
- {
- return 3;
- }
- };
- int test = getServiceForBook.getService("novel");
- assertEquals(3,test);
- }
- }
可以看出这两个Mock的结果是一样的都是把getService的方法改成3. 但是MockUp方式跟Expectations不同的是,MockUp把getService方法重新写了一遍并不像Expectations那样只要设定下变量就可以改变getService方法。
现在,我们稍微修改下原来的GetServiceForBook类。
- package cn.com.liandisys.book.service;
- public class GetServiceForBook {
- JustForTest jft = new JustForTest();
- public GetServiceForBook()
- {
- }
- public GetServiceForBook(JustForTest jft)
- {
- this.jft = jft;
- }
- public int getService(String bookType) {
- boolean flag = jft.getResult();
- System.out.println(flag);
- if ("novel".equals(bookType)) {
- return 1;
- }
- else {
- return 2;
- }
- }
- }
看到里面多了一个JustForTest的类,下面把JustForTest类代码贴出来
- public class JustForTest {
- public boolean getResult() {
- return false;
- }
- }
依然是一个简单的Java类,我们可以看出这个JustForTest类里有一个getResult的方法,这个方法返回的永远是false. 在GetServiceForBook类里申明了一个JustForTest类并调用了getResult方法然后打印出来。不出意外这个输出结果应该永远都是false。那下面我们用Mock把getResult方法“修改”成true。
- import static org.junit.Assert.*;
- import mockit.Expectations;
- import mockit.Injectable;
- import mockit.Tested;
- import org.junit.Test;
- public class GetServiceForBookTest {
- @Tested
- private GetServiceForBook getServiceForBook;
- @Injectable
- private JustForTest jft;
- @Test
- public void testBookService() {
- new Expectations(){
- {
- jft.getResult();
- result = true;
- times = 1;
- }
- };
- int test = getServiceForBook.getService("novel");
- assertEquals(1,test);
- }
- }
由于我们并没有mock掉getService所以返回值不是1就是2,对于上面的单元测试,给的参数是novel那返回值就应该是1。 然后我们运行一下可以发现控制台输出的是true而不是false了,这是因为我们把JustForTest类的getResult方法给Mock掉了。
里面还有两个注解一个@Tested一个是@Injectable。第一个@Tested不能变只能是这个,第二个可以写成@Mocked。如果第一个改成@Mocked的话输出结果就变成0,也就是说不过你的参数是什么结果都是输出0。这是因为在你使用Mocked注解时,如果没有进行“修改”,那系统就会自己帮你把这个类里的所有方法都Mock掉,而mock的内容就是返回默认值。(int的默认值是0)。
下面给出使用MockUp方式的
- import static org.junit.Assert.*;
- import mockit.Mock;
- import mockit.MockUp;
- import org.junit.Test;
- public class GetServiceForBookTest {
- private GetServiceForBook getServiceForBook = new GetServiceForBook();
- @Test
- public void testBookService() {
- new MockUp<JustForTest>(){
- @Mock
- public boolean getResult()
- {
- return true;
- }
- };
- int test = getServiceForBook.getService("novel");
- assertEquals(1,test);
- }
- }
这里就不多解释了,跟上面的MockUp例子很像,同样也是把getResult输出true。
通过查阅Jmockit文档,发现MockUp有一个方法叫getMockInstance。也就是创建一个Mock实例。我们可以这样理解,每一个需要被Mock的代码都可以看作是一个对象。就拿上面getResult例子来说JustForTest可以把它看作是一个Mock对象。所以我们还可以改成下面的形式。
- import static org.junit.Assert.*;
- import mockit.Mock;
- import mockit.MockUp;
- import org.junit.Test;
- public class GetServiceForBookTest {
- private GetServiceForBook getServiceForBook;
- @Test
- public void testBookService() {
- JustForTest mock = new MockUp<JustForTest>(){
- @Mock
- public boolean getResult()
- {
- return true;
- }
- }.getMockInstance();
- getServiceForBook = new GetServiceForBook(mock);
- int test = getServiceForBook.getService("novel");
- assertEquals(1,test);
- }
- }
这就是为什么我去重写getServiceForBook的构造函数,把Mock创建出来的对象赋给getServiceForBook里的JustForTest,这样也能达到Mock的目的
这次就先写到这里,其实对于Jmockit来说,这个只是沧海一栗,里面还有多东西需要研究,这里就先跟大家分享这么多,希望能对读者有用。
这是我第一次写博客,可能还有很多不足的地方,还请大大多多指教。
浅谈Jmockit使用相关推荐
- 浅谈MySQL存储引擎-InnoDBMyISAM
浅谈MySQL存储引擎-InnoDB&MyISAM 存储引擎在MySQL的逻辑架构中位于第三层,负责MySQL中的数据的存储和提取.MySQL存储引擎有很多,不同的存储引擎保存数据和索引的方式 ...
- 【大话设计模式】——浅谈设计模式基础
初学设计模式给我最大的感受是:人类真是伟大啊!单单是设计模式的基础课程就让我感受到了强烈的生活气息. 个人感觉<大话设计模式>这本书写的真好.让貌似非常晦涩难懂的设计模式变的生活化.趣味化 ...
- 学校计算机机房好处,浅谈学校计算机机房维护
浅谈学校计算机机房维护 现在的学校机房都配置了数量较多的计算机,而且机房的使用非常频繁.对于怎样维护好计算机,特别是计算机软件系统,对广大计算机教师来说是一个很重要且非常现实的问题.下面就本人在 ...
- java 中的单元测试_浅谈Java 中的单元测试
单元测试编写 Junit 单元测试框架 对于Java语言而言,其单元测试框架,有Junit和TestNG这两种, 下面是一个典型的JUnit测试类的结构 package com.example.dem ...
- mybatis与php,浅谈mybatis中的#和$的区别
浅谈mybatis中的#和$的区别 发布于 2016-07-30 11:14:47 | 236 次阅读 | 评论: 0 | 来源: 网友投递 MyBatis 基于Java的持久层框架MyBatis 本 ...
- 浅谈GCC预编译头技术
浅谈GCC预编译头技术 文/jorge --谨以此文,悼念我等待MinGW编译时逝去的那些时间. 其 实刚开始编程的时候,我是丝毫不重视编译速度之类的问题的,原因很简单,因为那时我用BASICA.后来 ...
- 【笔记】震惊!世上最接地气的字符串浅谈(HASH+KMP)
震惊!世上最接地气的字符串浅谈(HASH+KMP) 笔者过于垃圾,肯定会有些错的地方,欢迎各位巨佬指正,感激不尽! 引用:LYD的蓝书,一本通,DFC的讲稿,网上各路巨佬 Luguo id: 章鱼那个 ...
- 浅谈几种区块链网络攻击以及防御方案之其它网络攻击
旧博文,搬到 csdn 原文:http://rebootcat.com/2020/04/16/network_attack_of_blockchain_other_attack/ 写在前面的话 自比特 ...
- 浅谈几种区块链网络攻击以及防御方案之拒绝服务攻击
旧博文,搬到 csdn 原文:http://rebootcat.com/2020/04/14/network_attack_of_blockchain_ddos_attack/ 写在前面的话 自比特币 ...
最新文章
- Spring2.5注释驱动与基于注释的MVC
- 关于添加“服务引用”和“添加引用”的一点总结
- python字符串的美化_Python构造自定义方法来美化字典结构输出
- Spring @ControllerAdvice @ExceptionHandler
- StackExchange.Redis 命令扩展
- http协议知识msdn
- linux下的常用时间函数总结
- spss和python stata matlab_(SPSS,Matlab,stata,Python)相关性?
- 长沙android工程师,长沙安卓工程师辅导
- 关于C#编译器错误CS0685(VS2005)
- matlab定位噪声位置,Matlab怎么样调节KALMAN滤波中的过程噪声和观测噪声
- phpcms v9二次开发之模型类的应用(2)
- 成人大专计算机自我鉴定300字,自我鉴定300字成人大专
- uploadify php demo,php uploadify上传
- Selenium:鼠标、键盘事件
- UML用例图怎么画 有手就会
- 开源GIS的一些理解和介绍
- 金融反欺诈(项目练习)
- wlacm 铲雪车snow 题解
- 裁员潮来袭,如何度过这两年“艰苦岁月”
热门文章
- 2023-ISCC信息安全与对抗竞赛wp-misc(详解,有脚本( •̀ ω •́ ),脚本解析,有附件)
- windows CMD清空文件
- 立即升级 NGINX 以应对漏洞风险
- 阿拉德之怒显示服务器错误,阿拉德之怒无法进入游戏怎么办_阿拉德之怒无法进入游戏解决方法_快吧手游...
- 未来人工智能,将会替代人类的十大职业
- echarts 3d地图
- java map tostring_Map转为String
- .gitignore git忽略文件
- 水果销售系统课程设计(第一阶段--需求分析)
- iZotope RX 10 (专业的音频降噪修复软件) win/mac版