转自http://blog.csdn.net/changsu4615/article/details/46802517。如有疑问请联系我删除。

最近公司里要求使用Jmockit来辅助单元测试。之前也没接触过,研究了几天,今天就跟大家谈谈我怎么使用Jmockit。写一个小例子供大家参考。

如有不对的地方还请大家多多指正

对于Mock的作用这里就不详细介绍了,不清楚的可以自行百度。笔者使用的是1.15版本的Jmockit(默认读者已经把相应的包导好)

在开始测试之前我们先写一个简单的Java类,代码如下

[java]  view plain  copy
  1. public class GetServiceForBook {
  2. public int getService(String bookType) {
  3. if ("novel".equals(bookType)){
  4. return 1;
  5. }
  6. else {
  7. return 2;
  8. }
  9. }
  10. }

以上是一个极其简单的一个Java类,里面定义了一个getService方法。看了这个方法后可以确定,调用这个方法后得到的结果不是1就2.下面我们就来写一个小单元测试。

[java]  view plain  copy
  1. import static org.junit.Assert.*;
  2. import org.junit.Test;
  3. public class GetServiceForBookTest {
  4. private GetServiceForBook getServiceForBook = new GetServiceForBook();
  5. @Test
  6. public void testBookService() {
  7. int test = getServiceForBook.getService("novel");
  8. assertEquals(1,test);
  9. }
  10. }

对于上面的单元测试我相信不会有人看不懂,而且简单运行一下就是一个长长的绿条。那下面我们就开始使用Mock来“修改”我们的GetServiceForBook类。

刚刚也说明了,对于getService方法的返回值不是1就是2。那如果我想让getService返回3怎么办?很简单,使用Mock。先上Expectations的方式。

[java]  view plain  copy
  1. import static org.junit.Assert.*;
  2. import mockit.Expectations;
  3. import mockit.Injectable;
  4. import org.junit.Test;
  5. public class GetServiceForBookTest {
  6. @Injectable
  7. private GetServiceForBook getServiceForBook;
  8. @Test
  9. public void testBookService() {
  10. new Expectations(){
  11. {
  12. getServiceForBook.getService(anyString);
  13. result = 3;
  14. times = 1;
  15. }
  16. };
  17. int test = getServiceForBook.getService("novel");
  18. assertEquals(3,test);
  19. }
  20. }

以上就是使用Mock的方式把getService方法给“修改”了。所以底下的断言是看test和3的比较。很明显,这里用了Expectations把getService的返回值改成了3,也就是说在这个测试里不论我传进去的参数是什么,它的返回都是3.(使用@Injectable系统会自动注入,创建实例。)下面在给一个使用MockUp方式

[java]  view plain  copy
  1. import static org.junit.Assert.*;
  2. import mockit.Mock;
  3. import mockit.MockUp;
  4. import org.junit.Test;
  5. public class GetServiceForBookTest {
  6. private GetServiceForBook getServiceForBook = new GetServiceForBook();
  7. @Test
  8. public void testBookService() {
  9. new MockUp<GetServiceForBook>(){
  10. @Mock
  11. public int getService(String bookType)
  12. {
  13. return 3;
  14. }
  15. };
  16. int test = getServiceForBook.getService("novel");
  17. assertEquals(3,test);
  18. }
  19. }

可以看出这两个Mock的结果是一样的都是把getService的方法改成3. 但是MockUp方式跟Expectations不同的是,MockUp把getService方法重新写了一遍并不像Expectations那样只要设定下变量就可以改变getService方法。

现在,我们稍微修改下原来的GetServiceForBook类。

[java]  view plain  copy
  1. package cn.com.liandisys.book.service;
  2. public class GetServiceForBook {
  3. JustForTest jft = new JustForTest();
  4. public GetServiceForBook()
  5. {
  6. }
  7. public GetServiceForBook(JustForTest jft)
  8. {
  9. this.jft = jft;
  10. }
  11. public int getService(String bookType) {
  12. boolean flag = jft.getResult();
  13. System.out.println(flag);
  14. if ("novel".equals(bookType)) {
  15. return 1;
  16. }
  17. else {
  18. return 2;
  19. }
  20. }
  21. }

看到里面多了一个JustForTest的类,下面把JustForTest类代码贴出来

[java]  view plain  copy
  1. public class JustForTest {
  2. public boolean getResult() {
  3. return false;
  4. }
  5. }

依然是一个简单的Java类,我们可以看出这个JustForTest类里有一个getResult的方法,这个方法返回的永远是false. 在GetServiceForBook类里申明了一个JustForTest类并调用了getResult方法然后打印出来。不出意外这个输出结果应该永远都是false。那下面我们用Mock把getResult方法“修改”成true。

[java]  view plain  copy
  1. import static org.junit.Assert.*;
  2. import mockit.Expectations;
  3. import mockit.Injectable;
  4. import mockit.Tested;
  5. import org.junit.Test;
  6. public class GetServiceForBookTest {
  7. @Tested
  8. private GetServiceForBook getServiceForBook;
  9. @Injectable
  10. private JustForTest jft;
  11. @Test
  12. public void testBookService() {
  13. new Expectations(){
  14. {
  15. jft.getResult();
  16. result = true;
  17. times = 1;
  18. }
  19. };
  20. int test = getServiceForBook.getService("novel");
  21. assertEquals(1,test);
  22. }
  23. }

由于我们并没有mock掉getService所以返回值不是1就是2,对于上面的单元测试,给的参数是novel那返回值就应该是1。 然后我们运行一下可以发现控制台输出的是true而不是false了,这是因为我们把JustForTest类的getResult方法给Mock掉了。

里面还有两个注解一个@Tested一个是@Injectable。第一个@Tested不能变只能是这个,第二个可以写成@Mocked。如果第一个改成@Mocked的话输出结果就变成0,也就是说不过你的参数是什么结果都是输出0。这是因为在你使用Mocked注解时,如果没有进行“修改”,那系统就会自己帮你把这个类里的所有方法都Mock掉,而mock的内容就是返回默认值。(int的默认值是0)。

下面给出使用MockUp方式的

[java]  view plain  copy
  1. import static org.junit.Assert.*;
  2. import mockit.Mock;
  3. import mockit.MockUp;
  4. import org.junit.Test;
  5. public class GetServiceForBookTest {
  6. private GetServiceForBook getServiceForBook = new GetServiceForBook();
  7. @Test
  8. public void testBookService() {
  9. new MockUp<JustForTest>(){
  10. @Mock
  11. public boolean getResult()
  12. {
  13. return true;
  14. }
  15. };
  16. int test = getServiceForBook.getService("novel");
  17. assertEquals(1,test);
  18. }
  19. }

这里就不多解释了,跟上面的MockUp例子很像,同样也是把getResult输出true。

通过查阅Jmockit文档,发现MockUp有一个方法叫getMockInstance。也就是创建一个Mock实例。我们可以这样理解,每一个需要被Mock的代码都可以看作是一个对象。就拿上面getResult例子来说JustForTest可以把它看作是一个Mock对象。所以我们还可以改成下面的形式。

[java]  view plain  copy
  1. import static org.junit.Assert.*;
  2. import mockit.Mock;
  3. import mockit.MockUp;
  4. import org.junit.Test;
  5. public class GetServiceForBookTest {
  6. private GetServiceForBook getServiceForBook;
  7. @Test
  8. public void testBookService() {
  9. JustForTest mock = new MockUp<JustForTest>(){
  10. @Mock
  11. public boolean getResult()
  12. {
  13. return true;
  14. }
  15. }.getMockInstance();
  16. getServiceForBook = new GetServiceForBook(mock);
  17. int test = getServiceForBook.getService("novel");
  18. assertEquals(1,test);
  19. }
  20. }

这就是为什么我去重写getServiceForBook的构造函数,把Mock创建出来的对象赋给getServiceForBook里的JustForTest,这样也能达到Mock的目的

这次就先写到这里,其实对于Jmockit来说,这个只是沧海一栗,里面还有多东西需要研究,这里就先跟大家分享这么多,希望能对读者有用。

这是我第一次写博客,可能还有很多不足的地方,还请大大多多指教。

浅谈Jmockit使用相关推荐

  1. 浅谈MySQL存储引擎-InnoDBMyISAM

    浅谈MySQL存储引擎-InnoDB&MyISAM 存储引擎在MySQL的逻辑架构中位于第三层,负责MySQL中的数据的存储和提取.MySQL存储引擎有很多,不同的存储引擎保存数据和索引的方式 ...

  2. 【大话设计模式】——浅谈设计模式基础

    初学设计模式给我最大的感受是:人类真是伟大啊!单单是设计模式的基础课程就让我感受到了强烈的生活气息. 个人感觉<大话设计模式>这本书写的真好.让貌似非常晦涩难懂的设计模式变的生活化.趣味化 ...

  3. 学校计算机机房好处,浅谈学校计算机机房维护

    浅谈学校计算机机房维护    现在的学校机房都配置了数量较多的计算机,而且机房的使用非常频繁.对于怎样维护好计算机,特别是计算机软件系统,对广大计算机教师来说是一个很重要且非常现实的问题.下面就本人在 ...

  4. java 中的单元测试_浅谈Java 中的单元测试

    单元测试编写 Junit 单元测试框架 对于Java语言而言,其单元测试框架,有Junit和TestNG这两种, 下面是一个典型的JUnit测试类的结构 package com.example.dem ...

  5. mybatis与php,浅谈mybatis中的#和$的区别

    浅谈mybatis中的#和$的区别 发布于 2016-07-30 11:14:47 | 236 次阅读 | 评论: 0 | 来源: 网友投递 MyBatis 基于Java的持久层框架MyBatis 本 ...

  6. 浅谈GCC预编译头技术

    浅谈GCC预编译头技术 文/jorge --谨以此文,悼念我等待MinGW编译时逝去的那些时间. 其 实刚开始编程的时候,我是丝毫不重视编译速度之类的问题的,原因很简单,因为那时我用BASICA.后来 ...

  7. 【笔记】震惊!世上最接地气的字符串浅谈(HASH+KMP)

    震惊!世上最接地气的字符串浅谈(HASH+KMP) 笔者过于垃圾,肯定会有些错的地方,欢迎各位巨佬指正,感激不尽! 引用:LYD的蓝书,一本通,DFC的讲稿,网上各路巨佬 Luguo id: 章鱼那个 ...

  8. 浅谈几种区块链网络攻击以及防御方案之其它网络攻击

    旧博文,搬到 csdn 原文:http://rebootcat.com/2020/04/16/network_attack_of_blockchain_other_attack/ 写在前面的话 自比特 ...

  9. 浅谈几种区块链网络攻击以及防御方案之拒绝服务攻击

    旧博文,搬到 csdn 原文:http://rebootcat.com/2020/04/14/network_attack_of_blockchain_ddos_attack/ 写在前面的话 自比特币 ...

最新文章

  1. Spring2.5注释驱动与基于注释的MVC
  2. 关于添加“服务引用”和“添加引用”的一点总结
  3. python字符串的美化_Python构造自定义方法来美化字典结构输出
  4. Spring @ControllerAdvice @ExceptionHandler
  5. StackExchange.Redis 命令扩展
  6. http协议知识msdn
  7. linux下的常用时间函数总结
  8. spss和python stata matlab_(SPSS,Matlab,stata,Python)相关性?
  9. 长沙android工程师,长沙安卓工程师辅导
  10. 关于C#编译器错误CS0685(VS2005)
  11. matlab定位噪声位置,Matlab怎么样调节KALMAN滤波中的过程噪声和观测噪声
  12. phpcms v9二次开发之模型类的应用(2)
  13. 成人大专计算机自我鉴定300字,自我鉴定300字成人大专
  14. uploadify php demo,php uploadify上传
  15. Selenium:鼠标、键盘事件
  16. UML用例图怎么画 有手就会
  17. 开源GIS的一些理解和介绍
  18. 金融反欺诈(项目练习)
  19. wlacm 铲雪车snow 题解
  20. 裁员潮来袭,如何度过这两年“艰苦岁月”

热门文章

  1. 2023-ISCC信息安全与对抗竞赛wp-misc(详解,有脚本( •̀ ω •́ ),脚本解析,有附件)
  2. windows CMD清空文件
  3. 立即升级 NGINX 以应对漏洞风险
  4. 阿拉德之怒显示服务器错误,阿拉德之怒无法进入游戏怎么办_阿拉德之怒无法进入游戏解决方法_快吧手游...
  5. 未来人工智能,将会替代人类的十大职业
  6. echarts 3d地图
  7. java map tostring_Map转为String
  8. .gitignore git忽略文件
  9. 水果销售系统课程设计(第一阶段--需求分析)
  10. iZotope RX 10 (专业的音频降噪修复软件) win/mac版