mockito模拟依赖注入_使用Mockito模拟自动装配的字段

mockito模拟依赖注入

依赖注入是诸如Spring和EJB之类的Control容器反转的非常强大的功能。 将注入的值封装到私有字段中总是一个好主意。 但是,自动连线字段的封装会降低可测试性。

我喜欢Mockito解决此问题以模拟自动装配字段的方式。 将在示例中进行解释。 (此博客文章希望您对Mockito语法有点熟悉,但是它具有足够的自我描述性。)

这是测试模块的第一个依赖项。 是Spring单例豆。 该类将在测试中被模拟。

@Repository
public class OrderDao {public Order getOrder(int irderId){throw new UnsupportedOperationException("Fail is not mocked!");}
}

这是测试类的第二个依赖项。 它也是Spring组件。 该类将在测试中被侦听(部分嘲笑)。 它的方法calculatePriceForOrder将保持不变。 第二种方法将被存根。

@Service
public class PriceService {public int getActualPrice(Item item){throw new UnsupportedOperationException("Fail is not mocked!");}public int calculatePriceForOrder(Order order){int orderPrice = 0;for (Item item : order.getItems()){orderPrice += getActualPrice(item);}return orderPrice;}
}

这是正在测试的课程。 它自动装配上面的依赖项。

@Service
public class OrderService {@Autowiredprivate PriceService priceService;@Autowiredprivate OrderDao orderDao;public int getOrderPrice(int orderId){Order order = orderDao.getOrder(orderId);return priceService.calculatePriceForOrder(order);}
}

最后是测试示例。 它使用字段级别的注释:

  • @InjectMocks –实例化测试对象实例,并尝试将用@Mock@Spy注释的字段注入到测试对象的私有字段中
  • @Mock –创建其注释字段的模拟实例
  • @Spy –为带注释的字段实例创建间谍
public class OrderServiceTest {private static final int TEST_ORDER_ID = 15;private static final int TEST_SHOES_PRICE = 2;   private static final int TEST_SHIRT_PRICE = 1;@InjectMocksprivate OrderService testingObject;@Spyprivate PriceService priceService;@Mockprivate OrderDao orderDao;@BeforeMethodpublic void initMocks(){MockitoAnnotations.initMocks(this);}@Testpublic void testGetOrderService(){Order order = new Order(Arrays.asList(Item.SHOES, Item.SHIRT));Mockito.when(orderDao.getOrder(TEST_ORDER_ID)).thenReturn(order);//notice different Mockito syntax for spyMockito.doReturn(TEST_SHIRT_PRICE).when(priceService).getActualPrice(Item.SHIRT);Mockito.doReturn(TEST_SHOES_PRICE).when(priceService).getActualPrice(Item.SHOES);//call testing methodint actualOrderPrice = testingObject.getOrderPrice(TEST_ORDER_ID);Assert.assertEquals(TEST_SHIRT_PRICE + TEST_SHOES_PRICE, actualOrderPrice);}
}

所以当您运行此测试时会发生什么:

  1. 首先,TestNG框架使用@BeforeMethod批注并调用initMocks方法
  2. 此方法调用特殊的Mockito调用( MockitoAnnotations.initMocks(this) )来初始化带注释的字段。 没有此调用,这些对象将为null 。 这种方法的常见错误是忘记了该调用。
  3. 当所有测试字段都填充有所需值时,将调用test。

该示例不包括Spring上下文创建,并且Spring的注释在这里仅作为针对生产代码使用的示例。 测试本身不包含对Spring的任何依赖关系,并且会忽略其所有注释。 实际上,可以使用EJB批注代替它,也可以针对普通的(非IoC管理的)私有字段运行它。

开发人员倾向于将MockitoAnnotations.initMocks(this)调用视为不必要的开销。 但这实际上非常方便,因为它可以重置测试对象并重新初始化模拟。 您可以使用它为例

  • 当您使用相同的带注释实例的各种测试方法来确保各种测试运行不使用相同的记录行为时
  • 当使用重复/参数化测试时。 例如,您可以将此调用包含在测试方法本身中,并接收间谍对象作为测试参数(作为测试用例的一部分)。 结合TestNG @DataProvider功能,此功能非常性感(将在其他博客文章中对此进行解释)。

@Spy注释对象可以通过两种方式创建

  • 如果存在默认(非参数化)构造函数,则由Mockito框架自动进行
  • 或显式初始化(​​例如,当只有非默认构造函数时)

@InjectMocks注释的测试对象也可以显式初始化。

  • 可以从GitHub下载示例源代码。

参考:在http://lkrnac.net/博客上, 使用Mockito模拟来自JCG合作伙伴 Lubos Krnac的自动连线字段 。

翻译自: https://www.javacodegeeks.com/2014/02/use-mockito-to-mock-autowired-fields.html

mockito模拟依赖注入

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/344439.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【渝粤教育】电大中专药物化学基础_1作业 题库

1.关于药物的分配系数对药效的影响,叙述正确的是()。 A.分配系数愈小,药效愈好 B.分配系数愈大,药效愈好 C.分配系数愈小,药效愈低 D.分配系数愈大,药效愈低 E.分配系数适当,药效为好…

【渝粤教育】广东开放大学 动画原画设计 形成性考核 (22)

选择题 题目:默认情况下,用户在使用形状工具绘制形状时,形状图层的内容均以哪种形式填充。 题目:利用颜色取样器获取颜色时,最多可以创建多少个取样点 题目:哪种滤镜可以把图像变得柔和? 题目&a…

【渝粤题库】陕西师范大学200091 东方文学专题研究 作业

《东方文学专题》作业 一、单选题 1、( )是古代埃及的一部诗歌总集,也是世界上现存最古老的诗集和最早的书面文学作品。 A 《亡灵书》 B 《庄稼人的歌谣》 C 《荷马史诗》 D《神话》 2、( )被称为“史诗之王”&#xf…

java 80_【JavaWeb】80:js基础详解

今天是刘小爱自学Java的第80天。感谢你的观看,谢谢你。话不多说,开始今天的学习:JavaScript是一门编程语言,但凡是编程语言,其在基本语法上都是大同小异的。我们学了Java,那么再学习其它语言时,…

【渝粤题库】陕西师范大学200101 西方文学 作业(高起专)

《西方文学》作业 一.填空题 1.古希腊悲剧之父是 ,他的代表作品是 。 2.法国人文主义文学最杰出的代表作家是 ,他的代表作品是 。 3.法国批判现实主义文学的奠基人是 ,他的代表作品是 。 4.易卜生的四大社会问题剧是 、 、 、 。 …

半年时间能学会php吗_4个月真的能学会PHP吗

4个月真的能学会PHP吗有些一直想来源码时代学习PHP学科的学员很好奇,这么多的内容,在5个月左右就全部学完,真的可以么?这几个月以后自己还是一问三不知怎么办?今天,我们就来说说学习PHP这件事。PHP是什么,应用得怎么…

【渝粤题库】陕西师范大学200651线性代数 作业(高起专、高起本)

《线性代数》作业 一、选择题 1&#xff0e;如果D&#xff0c;则行列式的值应为&#xff1a; A&#xff0e; 6D B&#xff0e;12D C&#xff0e;24D D&#xff0e;36D 2&#xff0e;设A 为n阶方阵&#xff0c;R&#xff08;A&#xff09;r<n,那么&#xff1a; A&#xff0e;…

【渝粤题库】陕西师范大学201381 国际经济法作业

《国际经济法》作业 一、单项选择题 1&#xff0e;在下列贸易术语中&#xff0c;应当由买方办理租船订舱手续的是哪种术语&#xff1f; A&#xff0e;FOB      B&#xff0e;CFR      C&#xff0e;CIP       D&#xff0e;DDP 2&#xff0e;《联合国国际货物买…

php manager iis 8,PHPManager2下载

PHP Manager 2.x 理论支持win10,win8,win7,Windows Server2008,Windows Server2012,Windows Server2012R2,Windows Server2016,,Windows Server2019与其对应的IIS版本.--PHP Manager 2.4 for IIS10,IIS8,IIS7 下载简单但功能强大具有独特功能的工具&#xff0c;可以处理所有细节…

【渝粤题库】陕西师范大学202012 刑事诉讼法专论 作业

《刑事诉讼法专论》作业 一、单项选择题 1.在刑事诉讼中&#xff0c;法官消极中立&#xff0c;通过当事人举证、辩论发现事实真相&#xff0c;并由当事人人推动诉讼进程。这种诉讼构造属于下列哪一种类型&#xff1f;&#xff08; &#xff09; A.职权主义  B.当事人主义  …

【渝粤题库】陕西师范大学202411 管理学基础 作业 (专升本、高起本、高起专)

《管理学基础》作业 一、名词解释 管理       2. 科学管理理论    3. 定性目标      4. 管理主体经济方法     6&#xff0e;规划        7&#xff0e;行政组织理论    8&#xff0e;高层目标管理环境     10&#xff0e;人际关系学说 …

移动支付php,银联手机支付服务端PHP端代码

1 开发前准备 先和银联手机支付签约&#xff0c;他们会给你测试的证书已经手机客户端的控件2 将包里的文件(TESTMERCHANT.p12)经过openssl生成的密钥文件TESTMERCHANT.pm 默认密码是 13 PHP端程序下订单程序/** 银联支付* *///wap下订单接口(需要验证签名)public function wap…

【渝粤题库】陕西师范大学210022 学前儿童语言教育 作业(专升本)

《学前儿童语言教育》作业 一、填空题 学前儿童语言教育是研究儿童 的现象、 及其训练和 的一门科学&#xff0c;是学前教育师范院校 的一门应用性科目。学前儿童语言教育目标主要分为三个层次&#xff0c;即语言教育 、 和 。语言教育评价是语言教育 中的一个要素&#xff0c…

【渝粤题库】陕西师范大学292011 初级微观经济学 作业(高起专)

《初级微观经济学》作业 一、填空题 1.微观经济学的研究对象是————————————。 2.需求曲线向————倾斜&#xff0c;表明商品的价格与供给量成————变动。 3.支持价格是政府为了扶植某一行业的生产而规定的该行业产品的——————。 4&#xff0e;>1&…

【渝粤题库】陕西师范大学300011 历史文献学

《历史文献学》作业 一、名词解释 1&#xff0e;卜辞 2&#xff0e;旋风页 3&#xff0e;“经” 4&#xff0e;《史记》三家注 5&#xff0e;别集 6&#xff0e;校勘 7&#xff0e;载体文献 8&#xff0e;蝴蝶装 9&#xff0e;“朱丝栏”与“乌丝栏” 10&#xff0e;别史 11&am…

【渝粤题库】陕西师范大学500018 物理实验研究 作业(专升本)

《物理实验研究》作业 一、回答问题 什么是创新、具有那些特征&#xff1f;现代科技创新发展的主要特点有哪些&#xff1f;什么是创新性思维&#xff1f;创新思维的主要方法什么是创新技法本课程介绍的常用科技创新技法有哪些.奥斯本智力激励法及其基本原则组合型创新技法原理…

【渝粤题库】陕西师范大学720001 分子生物学

分子生物学作业 一、填空 DNA双螺旋直径为 &#xff08;1&#xff09; nm&#xff0c;每隔 &#xff08;2&#xff09; nm螺旋上升一圈。大肠杆菌DNA聚合酶Ⅲ的 &#xff08;3&#xff09; 活性使之具有 &#xff08;4&#xff09; 功能&#xff0c;极大地提高了DNA复制的保真…

企业知识库:从信息管理到知识创新的转变

在当今这个信息爆炸的时代&#xff0c;企业知识库的建设已经成为了企业持续发展的重要基石。从传统的信息管理到现代的知识创新&#xff0c;企业知识库的角色和功能也在不断地演变和升级。本文将探讨企业知识库的发展历程&#xff0c;以及如何实现从信息管理到知识创新的转变。…

php封装的数据库操作文件夹,PHP中对数据库操作的封装_php

现在我们把其封装在dbfz.inc中&#xff0c;其设计如下&#xff1a;$#60;?class dbInterface{ var $dbID1; //用于确定当前操作的数据库&#xff0c;当dbID为1代表mysql,当为 2代表 SQL Server&#xff0c;为3时为ODBC或其它。var $dbHost; //数据库所在主机域名var $dbUsernam…

Spring框架架构

这是Spring Framework Architecture的概述。 了解Spring Framework的各个组成部分如何组织以及如何相互联系。 如果您想了解什么是Spring框架及其功能&#xff0c;请阅读Spring框架简介 。 总览 Spring是一个模块化框架 。 它不是作为一个软件包或多个模块捆绑在一起的。 各种…