JMockit简单使用

文章目录

  • JMockit简单使用
  • 1. 参考文档
  • 2. 是什么?
    • 2.1. 简介
    • 2.2. 基本流程
  • 3. 怎么用?
    • 3.1. 引入依赖
    • 3.2. 使用
      • 3.2.1. 简单案例
      • 3.2.2. @Mocked
      • 3.2.3. @Injectable
      • 3.2.4. MockUp & @Mock

1. 参考文档

JMockit中文网

2. 是什么?

2.1. 简介

JMockit是一款Java类/接口/对象的Mock工具,目前广泛应用于Java应用程序的单元测试

一句话说明功能:你需要什么就可以mock什么。(比如本地没有Redis但是开发时又需要用到,那么就可以mock一个Redis的功能来隔离对Redis的依赖)

2.2. 基本流程

record(录制)---- replay(回放) ---- verify(验证)

1、record : 设置将要被调用的方法和返回值。

  • Expections中的方法至少被调用一次,否则会出现missing invocation错误。调用次数和调用顺序不限。
  • StrictExpectations中方法调用的次数和顺序都必须严格执行。如果出现了在StrictExpectations中没有声明的方法,会出现unexpected invocation错误。

2、replay:调用录制的方法,被录制的方法调用会被JMockit拦截并重定向到record阶段设定的行为。

3、verify:基于行为的验证,测试是否正确调用了依赖类,包括:调用了哪些方法;通过怎样的参数;调用了多少次;调用的相对顺序等。可以使用times,minTimes,maxTimes来验证。

3. 怎么用?

3.1. 引入依赖

<!-- 先声明jmockit的依赖 -->
<dependency><groupId>org.jmockit</groupId><artifactId>jmockit</artifactId><version>1.36</version><scope>test</scope>
</dependency><!-- 如果没有引入junit依赖就加上下面依赖 -->
<!-- 再声明junit的依赖 -->
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope>
</dependency>

3.2. 使用

3.2.1. 简单案例

将 jmockitInt() 方法的返回值 mock 成 100

public class JMockitDemo1001 {// 获取int值public int jmockitInt(){return 10;}
}// JMockit测试
@Test
public void jmockitIntTest(){JMockitDemo1001 jMockitDemo1001 = new JMockitDemo1001();// mock前返回值为 10Assert.assertEquals(jMockitDemo1001.jmockitInt(), 10);// 1、录制new Expectations(JMockitDemo1001.class) {{// 将该方法返回值 mock 为 100jMockitDemo1001.jmockitInt();result = 100;}};// 2、回放Assert.assertEquals(jMockitDemo1001.jmockitInt(), 100);// 3、验证new Verifications(){{jMockitDemo1001.jmockitInt();times  = 1;}};
}

3.2.2. @Mocked

  • @Mocked修饰的类/接口,是告诉JMockit,帮我生成一个Mocked对象,这个对象方法(包含静态方法)返回默认值
  • 如果返回类型为原始类型(short,int,float,double,long)就返回0,如果返回类型为String就返回null,如果返回类型是其它引用类型,则返回这个引用类型的Mocked对象
public class JMockitMocked {public static String strDataStatic = "strDataStatic";public static int intDataStatic = 10;public String strData = "strData";public int intData = 1;public static String getStrDataStatic(){return strDataStatic;}public static int getIntDataStatic(){return intDataStatic;}public String getStrData(){return strData;}public int getIntData(){return intData;}
}// mocked测试
public class JMockitMockedTest {@MockedJMockitMocked jMockitMocked;@Testpublic void test1001(){System.out.println(JMockitMocked.strDataStatic);  // strDataStaticSystem.out.println(JMockitMocked.intDataStatic);  // 10System.out.println(jMockitMocked.strData);  // nullSystem.out.println(jMockitMocked.intData);  // 0System.out.println(JMockitMocked.getStrDataStatic());  // nullSystem.out.println(JMockitMocked.getIntDataStatic());  // 0System.out.println(jMockitMocked.getStrData());  // nullSystem.out.println(jMockitMocked.getIntData());  // 0}
}

3.2.3. @Injectable

@Injectable 也是告诉 JMockit生成一个Mocked对象,但@Injectable只是针对其修饰的实例,而@Mocked是针对其修饰类的所有实例

  • @Injectable对类的静态方法,构造函数不进行mock
public class JMockitMocked {public static String strDataStatic = "strDataStatic";public static int intDataStatic = 10;public String strData = "strData";public int intData = 1;public static String getStrDataStatic(){return strDataStatic;}public static int getIntDataStatic(){return intDataStatic;}public String getStrData(){return strData;}public int getIntData(){return intData;}
}// mock测试
public class JMockitInjectableAndTestedTest {// @Mocked@Testpublic void test1001(@Mocked JMockitInjectableAndTested jMockitInjectableAndTested){System.out.println(JMockitInjectableAndTested.getStrDataStatic());  // nullSystem.out.println(JMockitInjectableAndTested.getIntDataStatic());  // 0System.out.println(jMockitInjectableAndTested.getStrData());  // nullSystem.out.println(jMockitInjectableAndTested.getIntData());  // 0}// @Injectable@Testpublic void test1002(@Injectable JMockitInjectableAndTested jMockitInjectableAndTested){System.out.println(JMockitInjectableAndTested.getStrDataStatic());  // strDataStaticSystem.out.println(JMockitInjectableAndTested.getIntDataStatic());  // 10System.out.println(jMockitInjectableAndTested.getStrData());  // nullSystem.out.println(jMockitInjectableAndTested.getIntData());  // 0}
}

3.2.4. MockUp & @Mock

MockUp & @Mock 的联合使用可以只 mock 对象的部分方法(当需要 mock 整个对象就可以考虑使用 @Mocked 或 @Injectable)

public class JMockitMockUpAndMock {public int getIntData1001(int num){return num;}public int getIntData1002(int num){return num;}
}// mock测试
public class JMockitMockUpAndMockTest {@Testpublic void test1001(){// 只需要把JMockitMockUpAndMock类传入MockUp类的构造函数new MockUp<JMockitMockUpAndMock>(JMockitMockUpAndMock.class) {// 想Mock哪个方法,就给哪个方法加上@Mock, 没有@Mock的方法,不受影响@Mockpublic int getIntData1001(int num) {return 10 * num;}};JMockitMockUpAndMock jMockitMockUpAndMock = new JMockitMockUpAndMock();System.out.println(jMockitMockUpAndMock.getIntData1001(2));  // 20System.out.println(jMockitMockUpAndMock.getIntData1002(2));  // 2}
}

JMockit简单使用相关推荐

  1. JMockit简单使用(二)

    JMockit使用时,建议使用Expectations{}块来录制行为,这样mock对象在运行时必须 依据Expectations块中定义的顺序依次调用方法,不能多调用也不能少调用,可以省略掉Veri ...

  2. Java也能做爬虫了?我爬取并下载了酷狗TOP500的歌曲!

    点击"开发者技术前线",选择"星标????" 在看|星标|留言,  真爱 作者:后山悟道人   链接:my.oschina.net/gllfeixiang/bl ...

  3. Jmock 原理简单说明

    在jmockit中,你可以使用MockUp来创建一个"fake"的实例,对某个方法指定自己的实现,而不是调用实际的方法. 对于接口类型,需要这样调用: @Mocked privat ...

  4. JMockit 指南 翻译

    原文 翻译并没有完全遵循原文,有个人的理解与提炼. 如果你觉得有什么地方生涩难懂,欢迎反馈.谢谢! 更新时间:2017-05-23 23:16:35 Mocked types and instance ...

  5. 单元测试mock框架——jmockit实战

    JMockit是google code上面的一个java单元测试mock项目,她很方便地让你对单元测试中的final类,静态方法,构造方法进行mock,功能强大.项目地址在:http://jmocki ...

  6. Jmockit使用指南

    概述 mock对象 虚拟的对象就是mock对象.mock对象就是真实对象在调试期间的代替品. 关于什么时候需要Mock对象,Tim Mackinnon给我们了一些建议: 真实对象具有不可确定的行为(产 ...

  7. 使用JMockit编写java单元测试

    之前<有效使用Mock编写java单元测试>一文中层介绍过使用EasyMock和PowerMock来编写java单元测试,今天介绍一个更加强大的工具--JMockit. 引用单元测试中mo ...

  8. (七)JMockit 的MockUp+@Mock--基础篇

    一种常见的mock方式:MockUp + @Mock import mockit.Mock; import mockit.MockUp; import org.junit.Assert; import ...

  9. 浅谈Jmockit使用

    转自http://blog.csdn.net/changsu4615/article/details/46802517.如有疑问请联系我删除. 最近公司里要求使用Jmockit来辅助单元测试.之前也没 ...

最新文章

  1. 深入理解JavaScript模拟私有成员
  2. Git指令2 - 操作分支
  3. vue封装axios接口
  4. 开发Teams Tabs应用程序
  5. java jpanel 叠加_java – 如何在JPanel上叠加,调整大小和居中组件?
  6. Matlab Tricks(十七)—— 使用 Latex
  7. 经典神经网络 -- MobileNet : 设计原理与pytorch实现
  8. 如何监控防火墙后的流量?
  9. day30 JavaWeb阶段——HTML基础(源码+w3cschool菜鸟教程)
  10. 明解C语言 初级篇1~8章
  11. 汽车智能电气技术分析
  12. 使用HealthKit过程中遇到的坑
  13. 2022年面试,整理全网初、中、高级常见 Java 面试题
  14. 谈谈大学两年的学习经历
  15. 【已解决】ocker: Error response from daemon: Conflict. The container name “/nginx“ is alrea.....
  16. 计算机应用提高篇课后答案,计算机应用技能技巧
  17. 【SPIE独立出版|往届已检索、湘潭大学主办】第二届绿色通信、网络与物联网国际学术会议 (CNIoT 2022)
  18. 如何快速搭建手游平台?
  19. 【转】关于测试工程师的几个笑话
  20. pr怎么把视频去水印

热门文章

  1. 2021山东大学人工智能导论硕士回忆版
  2. Java处理json编程之Jackson使用篇
  3. 路飞学城老男孩Python全栈开发实战鸡汤部分Alex
  4. 刷题记录:牛客NC14975方块与收纳盒
  5. Oracle 的内存参数配置
  6. DNS解析过程【访问网站】
  7. 第十二届蓝桥杯单片机省赛
  8. 如何将图片背景设置为无色
  9. 【计算机网络实验】以太网交换机的自学习算法
  10. mutations vuex 调用_vuex的mutations与actions的使用测试