大型软件项目,往往会在设计的时候进行模块化划分,模块之间存在依赖关系。为了减少各个模块之间的耦合,通过接口进行依赖,各个模块由不同的开发组进行并行开发。如果A模块需要使用B模块的接口,但是B模块由于开发进度缓慢,并没有完成对应实现类的开发。那么这个时候A进行单元测试就有困难了。如果A需要测试自己的模块功能,就需要将B的接口进行mock。下面介绍下jmockit如何mock接口的。

package code.c1;public interface IStudentService {public String getName(int id);public int getAge(int id);
}
package code.c1;public abstract class AbstractStudentService {public String getName(int id) {return "ATY";}public abstract int getAge(int id);
}

下面是单元测试:

package net.aty.testtools.jmockit.c1;import mockit.Mock;
import mockit.MockUp;import org.junit.Assert;
import org.junit.Test;import code.c1.AbstractStudentService;
import code.c1.IStudentService;public class Run {@Testpublic void t1() {MockUp<IStudentService> proxyStub = new MockUp<IStudentService>() {// 需要使用@Mock标记,否则jmockit不会处理;// 而且方法的签名必须与接口中方法签名一致,否则jmockit会报错@Mockpublic String getName(int id) {return "00" + id;}};IStudentService mockInstance = proxyStub.getMockInstance();Assert.assertEquals("001", mockInstance.getName(1));Assert.assertEquals(0, mockInstance.getAge(1));proxyStub.tearDown();}@Testpublic void t2() {MockUp<AbstractStudentService> proxyStub = new MockUp<AbstractStudentService>() {@Mockpublic int getAge(int id) {return 10 * id;}};AbstractStudentService mockInstance = proxyStub.getMockInstance();Assert.assertEquals("ATY", mockInstance.getName(1));Assert.assertEquals(10, mockInstance.getAge(1));proxyStub.tearDown();}}

jmockit有如下特点:

1、如果目标接口中存在多个方法,我们只需要关注需要自己mock的方法即可,对于不需要的方法,jmockit会提法默认实现,不用我们去实现接口中的所有方法。

2、MockUp中mock的方法一定要与对应接口中方法签名一致,否则会报错java.lang.IllegalArgumentException: Matching real methods not found for the following mocks。

3、MockUp中的方法一定要加@Mock注解,否则会被jmockit忽略,不能达到mock的目的。

我使用的jmockit版本如下:

<dependency><groupId>org.jmockit</groupId><artifactId>jmockit</artifactId><version>1.22</version>
</dependency>

JMockit学习之mock接口和抽象类相关推荐

  1. Java学习十之接口和抽象类

    接口和抽象类 一.抽象类 1.1什么是抽象类? 抽象类是一种特殊的类 被abstract关键字修饰的类就是抽象类 修饰符 abstract class 类别{ 类体 } 在Java中,有些类不适合创建 ...

  2. 【学习Day5】接口和抽象类的区别、作用和使用场景

    目录 一.接口和抽象类的区别? 二.接口和抽象类的作用? 三.接口和抽象类的使用场景? 一.接口和抽象类的区别? 抽象类用abstract 来修饰 接口用interface修饰 抽象类中有构造器 接口 ...

  3. 慢慢人生路,学点Jakarta基础-深入剖析Java的接口和抽象类

    在java面向对象编程的,抽象类和接口始终存在有疑问的地方,因为两者太多相似有太多不同,在刚开始学习的时候经常弄的不对,使用情景搞混,今天来总结之前学习Java中接口和抽象类的问题. 抽象类 了解:只 ...

  4. JavaSE学习总结(六)——接口、抽象类、内部类

    一.不需要实例化的原因 看一个示例: package com.zhangguo.chapter5.s1;/**动物园*/ public class Zoo {public static void ma ...

  5. Java中接口、抽象类与内部类学习

    2019独角兽企业重金招聘Python工程师标准>>> Java中接口.抽象类与内部类学习 接口与内部类为我们提供了一种将接口与实现分离的更加结构化的方法. 抽象类和抽象方法 抽象方 ...

  6. 接口和抽象类练习:教练和运动员案例: (1)人员:乒乓球运动员和篮球运动员。乒乓球教练和篮球教练。 (2)为了出国交流,跟乒乓球相关的人员都需要学习英语。 请用所学知识分析,设计类和接口。

    接口和抽象类的练习 需求分析: 教练和运动员案例: (1)人员:乒乓球运动员和篮球运动员.乒乓球教练和篮球教练. (2)为了出国交流,跟乒乓球相关的人员都需要学习英语. 请用所学知识分析,设计类和接口 ...

  7. Java接口学习(接口的使用、简单工厂、代理模式、接口和抽象类的区别)

    前言引入 官方解释:Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能). 我的 ...

  8. java学习第八天继承,抽象类,接口

    日期:2019年11月13日 1.子父类中的构造函数的特点: 在子类构造对象时发现,访问子类构造函数时,父类构造函数也运行了.为啥? 答:在子类的构造函数中第一行默认的隐式语句,super(); ** ...

  9. c# 接口和抽象类学习总结

    下面实例定义了一个抽象类和一个接口,抽象类中定义一个手机的属性和方法,接口定义一个玩游戏的方法. 抽象类代码: //抽象类是一个父类+约束 父类是为了实现代码重用 约束是为了多态变化 单继承 is a ...

最新文章

  1. YOLO-FastestV2:更快,更轻!移动端高达300 FPS!参数量仅250k
  2. 人力资源大数据解决方案
  3. java课堂疑问解答与思考1
  4. JBoss、Tomcat Classloader不完全分析
  5. jboss resin tomcat 相关
  6. StackExchange.Redis 访问封装类
  7. Flume 1.7 源码分析(四)从Source写数据到Channel
  8. 【Linux网络编程学习】socket API(socket、bind、listen、accept、connect)及简单应用
  9. 用python进行多页数据爬取_Python Scrapy如何实现多页数据爬取?
  10. dev 中 gridcontrol1 滚动条重绘_浏览器的重绘和回流(Repaint amp; Reflow)
  11. 访问iis元数据库失败怎么解决
  12. 深度学习TF—2.TensorFlow2高阶操作
  13. 1. 虚拟机使用技巧
  14. 【汉字识别】基于matlab SVM汉字识别【含Matlab源码 830期】
  15. 2020-05-26
  16. 从前端页面上下载为png格式的图片
  17. 01-Java中的集合
  18. 正则函数--search/match/findall/sub/split
  19. 手机修改设备信息之安装xposed框架
  20. Unicode字符列表

热门文章

  1. CLIP,GLIP论文解读,清晰明了
  2. 如何入驻拼多多商城 拼多多入驻形式有那些
  3. 实施工程师日常必备技能
  4. Java培训,看这一篇就够了
  5. (一)虚拟化及云原生基本概念及原理解析
  6. PHP实现棱形代码(PHP练习)
  7. java中person作用_以下Java程序中Person(){};是什么意思,有什么作用?
  8. 【统计学习方法】模型评估与模型选择
  9. 左益豪:用代码创造一个新世界|OneFlow U
  10. 深入理解JVM虚拟机第三版疑问解析