使用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

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

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

相关文章

西游之路——python全栈——CRM项目之表结构设计

一、表结构设计 1 from django.db import models2 from django.contrib.auth.models import User3 4 """自带验证"""5 class UserProFile(models.Model):6 """用户信息表"""7 user models.OneToOneField…

你见过吗?9款超炫的复选框(Checkbox)效果

复选框(Checkbox)在各个浏览器中的效果不一致,因此很多 Web 开发人员会自己重新设计一套界面和使用体验都更佳的复选框功能。下面就给大家分享9款超炫的复选框(Checkbox)效果,纯 CSS3 实现,未使…

系统制成docker镜像_docker镜像原理 镜像制作 dockerfile

为什么一个centos镜像只有两百多兆,而tomcat镜像五百多兆1.先说说操作系统操作系统组成部分:进程调度子系统进程通信子系统内存管理子系统设备管理子系统文件管理子系统网络通信子系统作业控制子系统Linux文件系统由bootfs和rootfs两部分组成bootfs&…

linux的vi命令详解,Linux上Vi命令详解

Linux下Vi命令详解补充一点:在vi中使用命令的方法是:冒号命令回车,如:q 回车代表退出。这里有一本0分下载关于Vi详细介绍的书:http://download.csdn.net/detail/zqiang_55/4399731文本编辑器是所有计算机系统中最常用的一种工具。…

jpg、gif、png-8、png-24的区别

一、gif格式的特点 1、透明性。gif是一种布尔透明类型,即它可以是全透明,也可以是全不透明,但是没有半透明 2、动画。gif支持动画 3、无损耗性。gif是一种无损耗的图像格式,这意味着你可以对gif图片做任何操作也不会使图片质量产生…

Java依赖注入选项

我想花一些时间来总结一些流行的Java依赖注入(DI)框架。 这是可用功能的高级概述。 首先,什么是依赖注入? “依赖注入是一种软件设计模式,可以删除硬编码的依赖,并可以在运行时或编译时更改它们。” – 维…

实用技巧:使用 Google Analytics 跟踪 JS 错误

Google Analytics(谷歌分析)不仅仅是一个流量统计工具,你还可以用它来测量广告活动的有效性,跟踪用户多远到所需的页面流(从点击广告到购物车到结账页面)获取,并基于用户的信息设置浏览器和语言…

从Ubuntu 14.04 LTS版升级到Ubuntu 16.04 LTS

Ubuntu 16.04 (Xerial Xerus) Long Term Support版于最近发布了。要想了解它的新功能和新特性,就必须升级或安装这个新系统。 本文讲述怎样一步步从Ubuntu 14.04 LTS版升级到Ubuntu 16.04 LTS版。要注意在升级前做好重要数据的备份,以免造成数据损失。因…

finditerable 转list_java – 通过拆分和运行将ListenableFuture转换为Iterable

(替代my original answer)但是,如果转型是缓慢的,或者某些输入可能会失败但是对其他输入成功会怎么样?在这种情况下,我们希望单独转换每个输出.另外,我们希望确保转换只发生一次.我们的集合转换方法不能保证这一点.因此,在您的示例代码中,输出上的每次迭代都会向执行…

linux 的date命令详解,linux之date命令详解

时间方面 :% : 印出% %n : 下一行%t : 跳格%H : 小时(00..23)%I : 小时(01..12)%k : 小时(0..23)%l : 小时(1..12)%M : 分钟(00..59)%p : 显示本地 AM 或 PM%r : 直接显示时间 (12 小时制,格式为 hh:mm:ss [AP]M)%s : 从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止…

Java 8:对集合中的值进行排序

意识到Java 8将在接下来的几周内发布其GA版本之后,我认为现在是时候来看看它了,在过去的一周里,我一直在阅读Venkat Subramaniam的书 。 我要讲的是第3章,其中涉及对人员集合进行排序。 Person类的定义大致如下: sta…

html的table弹窗_Js弹出基于Table的可关闭浮动层

可以拖动和隐藏的层,替代弹出窗口isIEdocument.all;isNN!document.all&&document.getElementById;isN4document.layers;isHotfalse;function ddInit(e){topDogisIE ? "BODY" : "HTML";whichDogisIE ? document.all.theLayer : docume…

Linux装ntfs后内存不够,Linux_安装Ubuntu后无法使用NTFS硬盘或移动硬盘,  在安装Ubuntu系统后,存在 - phpStudy...

安装Ubuntu后无法使用NTFS硬盘或移动硬盘在安装Ubuntu系统后,存在无法使用NTFS硬盘或移动硬盘的问题,下面小编就给大家介绍下Ubuntu系统无法挂载NTFS的解决方法,不知如何挂载的朋友不妨来了解下。具体问题如下图所示:“Please res…

TJOI2018Party

题目描述 小豆参加了\(NOI\)的游园会,会场上每完成一个项目就会获得一个奖章,奖章 只会是\(N\), \(O\), \(I\)的字样。在会场上他收集到了\(K\)个奖章组成的串。 兑奖规则是奖章串和兑奖串的最长公共子序列长度为小豆最后奖励的等级。 现在已知兑奖串长度…

HTML5 Dashboard – 那些让你激动的 Web 技术

HTML5 Dashboard 是一个 Mozilla 推出的项目,里面展示了最前沿的 HTML5,CSS3,JavaScript 技术。每一项技术都有简洁,在线演示以及详细的文档链接。这些技术将成为未来一段时间 Web 开发的顶尖技术,如果不想落伍的话就赶…

通过自动回复机器人学Mybatis---基础版

第1章 案例简介 介绍要实现的案例情况,后面会通过这个案例来学习 Mybatis第2章 实战第一部----黎明前的黑暗 在没有 Mybatis 的情况下,使用 Jsp Servlet Jdbc 实现案例中的一个模块开发流程1: 开发流程2: 开发流程3:…

部署到Maven中央存储库

您需要使您的Java库公开访问吗? 您的项目托管在GitHub上吗? 您是否喜欢“将所有功能都部署到Maven Central Repository”按钮的想法? 我将展示如何使用maven-release-plugin进行设置 。 源代码托管在GitHub上,因此还将描述对源代码…

Scroll Depth – 衡量页面滚动的 Google 分析插件

Scroll Depth 是一个小型的 Google Analytics(谷歌分析)插件,可以让你衡量用户在页面上滚动了多远。它可以监控 25%、50%、75% 和 100% 四个滚动点,并发送谷歌分析事件。 您还可以跟踪页面上的特定元素是否滚动到视图中。例如在博…

aws ec2时间_AWS中自动化的三大领域,以避免支付过多的云账单

AWS是全球最常用的云服务之一。 Gartner Magic Quadrant将AWS评为最大的IaaS提供商。每个可能的域都由企业使用AWS服务。 全球约有 1,000,000家公司正在使用AWS作为其IaaS提供商。从Netflix到Unilever再到Met Office,每个人都转移到AWS上的云基础架构。既然您正在阅…

linux vector 头文件,LINUX 之Vector用法

在Linux开发过程中常用到的一个功能----列表显示.如何将中心数据进行列表显示呢?这里就用到了VECTOR容器.从中心获取的数据通过VECTOR容器传输给站点程序从而实现批量数据的传输.VECTOR容器常用的函数包括以下几个1.push_back函数函数原型:void push_back(const T& x);实现…