JMockit简单使用
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简单使用相关推荐
- JMockit简单使用(二)
JMockit使用时,建议使用Expectations{}块来录制行为,这样mock对象在运行时必须 依据Expectations块中定义的顺序依次调用方法,不能多调用也不能少调用,可以省略掉Veri ...
- Java也能做爬虫了?我爬取并下载了酷狗TOP500的歌曲!
点击"开发者技术前线",选择"星标????" 在看|星标|留言, 真爱 作者:后山悟道人 链接:my.oschina.net/gllfeixiang/bl ...
- Jmock 原理简单说明
在jmockit中,你可以使用MockUp来创建一个"fake"的实例,对某个方法指定自己的实现,而不是调用实际的方法. 对于接口类型,需要这样调用: @Mocked privat ...
- JMockit 指南 翻译
原文 翻译并没有完全遵循原文,有个人的理解与提炼. 如果你觉得有什么地方生涩难懂,欢迎反馈.谢谢! 更新时间:2017-05-23 23:16:35 Mocked types and instance ...
- 单元测试mock框架——jmockit实战
JMockit是google code上面的一个java单元测试mock项目,她很方便地让你对单元测试中的final类,静态方法,构造方法进行mock,功能强大.项目地址在:http://jmocki ...
- Jmockit使用指南
概述 mock对象 虚拟的对象就是mock对象.mock对象就是真实对象在调试期间的代替品. 关于什么时候需要Mock对象,Tim Mackinnon给我们了一些建议: 真实对象具有不可确定的行为(产 ...
- 使用JMockit编写java单元测试
之前<有效使用Mock编写java单元测试>一文中层介绍过使用EasyMock和PowerMock来编写java单元测试,今天介绍一个更加强大的工具--JMockit. 引用单元测试中mo ...
- (七)JMockit 的MockUp+@Mock--基础篇
一种常见的mock方式:MockUp + @Mock import mockit.Mock; import mockit.MockUp; import org.junit.Assert; import ...
- 浅谈Jmockit使用
转自http://blog.csdn.net/changsu4615/article/details/46802517.如有疑问请联系我删除. 最近公司里要求使用Jmockit来辅助单元测试.之前也没 ...
最新文章
- 深入理解JavaScript模拟私有成员
- Git指令2 - 操作分支
- vue封装axios接口
- 开发Teams Tabs应用程序
- java jpanel 叠加_java – 如何在JPanel上叠加,调整大小和居中组件?
- Matlab Tricks(十七)—— 使用 Latex
- 经典神经网络 -- MobileNet : 设计原理与pytorch实现
- 如何监控防火墙后的流量?
- day30 JavaWeb阶段——HTML基础(源码+w3cschool菜鸟教程)
- 明解C语言 初级篇1~8章
- 汽车智能电气技术分析
- 使用HealthKit过程中遇到的坑
- 2022年面试,整理全网初、中、高级常见 Java 面试题
- 谈谈大学两年的学习经历
- 【已解决】ocker: Error response from daemon: Conflict. The container name “/nginx“ is alrea.....
- 计算机应用提高篇课后答案,计算机应用技能技巧
- 【SPIE独立出版|往届已检索、湘潭大学主办】第二届绿色通信、网络与物联网国际学术会议 (CNIoT 2022)
- 如何快速搭建手游平台?
- 【转】关于测试工程师的几个笑话
- pr怎么把视频去水印