使用Spring JUnit规则进行参数化集成测试

Spring 4.2附带了全新的JUnit规则: SpringClassRuleSpringMethodRule 。 使用JUnit规则的主要优点是让开发人员摆脱SpringJUnit4ClassRunner并在Spring集成测试中利用不同的JUnit运行器。 我认为Spring JUnit Rules的最大机会是易于创建参数化的集成测试。

要测试的代码

出于本文的目的,我使用了现有的Spring Boot Jersey Demo应用程序: https : //github.com/kolorobot/spring-boot-jersey-demo 。 该应用程序公开了简单的REST API以与客户对象一起使用。

集成测试–“旧”方式

在Spring 4.2之前,集成测试可能如下所示:

@RunWith(SpringJUnit4ClassRunner.class)
@ApplicationTest
public class SaveCustomerTest {private RestTemplate restTemplate = new TestRestTemplate("demo", "123");@Testpublic void savesCustomer() {// actURI uri = restTemplate.postForLocation("http://localhost:9000/customer",new Customer("John", "Doe"));// assertResponseEntity<Customer> responseEntity =restTemplate.getForEntity(uri, Customer.class);Customer customer = responseEntity.getBody();assertThat(customer.getFirstname()).isEqualTo("John");assertThat(customer.getLastname()).isEqualTo("Doe");}
}

@ApplicationTest是一个分组注解,它包装了多个Spring的注解:

@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
@org.springframework.boot.test.IntegrationTest("server.port=9000")
@ActiveProfiles("web")
@Sql(scripts = "classpath:data.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD)
public @interface ApplicationTest {}

您可能会注意到,以上测试使用标准SpringJUnit4ClassRunner ,这是一个自定义运行程序,在JUnit集成测试中增加了Spring Framework的支持。 并且由于不能在JUnit中使用多个运行程序,因此我们需要找到一种变通方法,以使用Spring和JUnitParams创建参数化测试(这并不是那么困难)。

使用Spring JUnit规则进行参数化测试

值得一提的是,Spring 4.2随附了SpringJUnit4ClassRunner的便捷替代SpringJUnit4ClassRunner :Spring JUnit Rules。 让我们来看一个例子:

@RunWith(JUnitParamsRunner.class)
@ApplicationTest
public class SaveCustomerParameterizedTest {@ClassRulepublic static final SpringClassRule SCR = new SpringClassRule();@Rulepublic final SpringMethodRule springMethodRule = new SpringMethodRule();private RestTemplate restTemplate = new TestRestTemplate("demo", "123");@Test@Parameterspublic void savesCustomer(String first, String last) {// actURI uri = restTemplate.postForLocation("http://localhost:9000/customer",new Customer(first, last));// assertResponseEntity<Customer> responseEntity =restTemplate.getForEntity(uri, Customer.class);Customer customer = responseEntity.getBody();assertThat(customer.getFirstname()).isEqualTo(first);assertThat(customer.getLastname()).isEqualTo(last);}public Object[] parametersForSavesCustomer() {return $($("John", "Doe"),$("John", "Smith"),$("Deborah", "Johnson"),$("Jan", "Kowalski"));}
}

原始代码没有太多更改,但最重要的是:

  • JUnitParamsRunner – JUnitParams是标准JUnit参数化测试的替代方法。 我在这里写过博客: http : //blog.codeleak.pl/2013/12/parametrized-junit-tests-with.html和此处: http : //blog.codeleak.pl/2014/11/unit-testing- excercise-with-fizzbuzz.html 。
  • SpringClassRule -支持的类级别功能SpringJUnit4ClassRunner ,必须用相结合SpringMethodRule 。 字段的名称无关紧要,但它必须是公共的,静态的和最终的。
  • SpringMethodRule -支持的实例级和方法级设有SpringJUnit4ClassRunner因此,它必须与组合SpringClassRule
  • @Parameters –测试参数的注释。 默认情况下,需要parametersFor<methodName>方法。

使用gradle test --tests *SaveCustomerParameterizedTest运行测试将生成以下报告:

0B0b09VuqaAG8RjQxMWVnMXZlRWM

如您所见,执行了4个测试。 第一个花费了大部分时间,因为初始化了Spring上下文,后面的测试非常快。

摘要

在Spring Test Framework中添加Spring JUnit规则可以显着改善集成测试,尤其是在进行参数化测试时。 但是,不仅JUnitParams可以用于此目的。 您也可以尝试使用标准的JUnit org.junit.runners.Parameterized

资源资源

  • Spring框架参考-http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#testcontext-junit4-rules
  • 使用JUnitParams进行参数化的JUnit测试– http://blog.codeleak.pl/2013/12/parametrized-junit-tests-with.html
  • JUnitParams – https://github.com/Pragmatists/JUnitParams
  • 使用FizzBu​​zz和JUnitParams进行单元测试的练习– http://blog.codeleak.pl/2014/11/unit-testing-excercise-with-fizzbuzz.html

翻译自: https://www.javacodegeeks.com/2015/08/parameterized-integration-tests-with-spring-junit-rules.html

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

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

相关文章

IOS 开发技能图谱——ios 开发工程师必知必会要点

导读&#xff1a;iOS 开发工程师技能图谱&#xff0c;包含开发基础、开发进阶、设计模式、开源项目、APP上传与审核、第三方服务等。 IOS 开发工程师技能图谱 下载地址 点我下载高清iOS 开发工程师技能图谱 关注公众号 电商程序员&#xff0c;回复 iOS 开发工程师技能图谱&am…

网络数据包收发流程(四):协议栈之packet_type

进入函数netif_receive_skb()后&#xff0c;skb正式开始协议栈之旅。先上图&#xff0c;协议栈大致过程如下所示&#xff1a;跟OSI七层模型不同&#xff0c;linux根据包结构对网络进行分层。比如&#xff0c;arp头和ip头都是紧跟在以太网头后面的&#xff0c;所以在linux协议栈…

OpenResty学习地图来啦,速速收藏!

导读&#xff1a;OpenResty学习地图&#xff0c;全英文文档 OpenResty学习地图 下载地址 点我下载高清OpenResty技能图谱 关注公众号电商程序员&#xff0c;回复OpenResty技能图谱&#xff0c;获取下载链接&#xff01;

java swing游戏_Java Swing井字游戏

java swing游戏大家好&#xff01; 哇&#xff0c;自从我在这里发布了东西以来已经有一段时间了&#xff01; 我必须说我真的很想写东西&#xff0c;我保证我不会再陷入“作家的障碍”。 希望 ..最近两个月发生了很多事情&#xff0c;我有很多话要说。 但是在这篇文章中&#x…

恭喜孙叫兽在CSDN年度之“战”中脱颖而出——喜提一等奖(小米手环+定制勋章)

导读&#xff1a;在这个多灾多难又充满惊喜注定不平凡的2020年&#xff0c;大家一起与CSDN共同跨过了艰难的疫情&#xff0c;共同经历烦躁的远程办公&#xff0c;一起为科比的逝世而难过&#xff0c;共同度过2020那所谓世界末日&#xff0c;充满青春&#xff0c;充满活力&#…

Block(Closure) Tips

使用 Block 的时候谨记以下几点&#xff1a; 1.Block类型&#xff1a;全局块&#xff08;Global Block&#xff09;和堆块&#xff08;Heap Block&#xff09;&#xff0c;以及栈块&#xff08;Stack Block&#xff09;。2.变量捕获: 默认无法修改变量&#xff0c;需要添加 __b…

【APICloud系列|33】通过程序循环数据集合的时候闭包加入imageCache方法

导读:一般实现的两种思路 1、通过程序循环数据集合的时候闭包加入imageCache方法。 2、通过递归数据集合实现 发现都不是我理想的效果,数据集合量较大的时候imageCache处理的时间比不用imageCache展示的时间要慢很多,展示会有明显延迟,最终采取以下方法 还是for循环将html拼…

Linux最危险的几个命令

Linux最危险的几个命令 Linux最危险的几个命令危险命令介绍删除文件和目录命令rmLinux 的 dd 命令mkfs 格式化硬盘分区shutdown> fileMore Linux最危险的几个命令 仅个人想法&#xff0c;会持续不间断更新和改进。 Linux系统中的命令最美妙也最危险。 如果几个操作系统&…

Java无处不在:使用DukeScript在任何地方运行一次编写

在相当长一段时间内&#xff0c;Java都未能兑现“一次编写&#xff0c;随处运行”的承诺。 DukeScript希望通过在跨平台应用程序中实现视图和逻辑的清晰分离来改变这种状况。 在本文中&#xff0c;一个简单的场景用于介绍DukeScript的基础。 多年来&#xff0c;Java Swing使开…

数据仓库建设中的数据建模方法(转)

简介&#xff1a; 本文的主要内容不是介绍现有的比较流行的主要行业的一些数据模型&#xff0c;而是将笔者在数据仓库建设项目中的一些经验&#xff0c;在这里分享给大家。希望帮助大家在数据仓库项目建设中总结出一套能够合乎目前业界规范的&#xff0c;满足大部分行业数据仓库…

PAT 1065 A+B and C (64bit) (20)

1065. AB and C (64bit) (20) 时间限制 100 ms内存限制 65536 kB代码长度限制 16000 B判题程序 Standard作者 HOU, QimingGiven three integers A, B and C in [-263, 263], you are supposed to tell whether AB > C. Input Specification: The first line of the input gi…

十大有用但又偏执的Java编程技术

经过一段时间的编码&#xff08;以我为例&#xff0c;大约20年左右&#xff0c;当您玩得开心时光飞逝&#xff09;&#xff0c;人们开始接受这些习惯。 因为&#xff0c;你知道... 任何可能出错的事情都会发生。 这就是为什么人们会采用“防御性编程”的原因&#xff0c;即偏执…

NGUI 3.5教程(二)Label 标签 (Hello world)、多行文本

写在前面&#xff1a; 本文将创建NGUI的第一个样例。依照编程传统&#xff0c;第一个样例&#xff0c;就是做一个Hello world 显示出来。NGUI。我们用Label来实现 。欢迎大家纠错、拍砖&#xff01;原创非常辛苦&#xff0c;如有转载&#xff0c;请注明出处&#xff1a;htt…

linux下php可以实现哪些功能,基于Linux的远程管理系统的设计与实现(PHP)

基于Linux的远程管理系统的设计与实现(PHP)来源&#xff1a;2BYSJ.cn 资料编号&#xff1a;2SJ260700 资料等级&#xff1a;★★★★★ %D7%CA%C1%CF%B1%E0%BA%C5%A3%BA2SJ260700以下是资料介绍,如需要完整的请充值下载. 本资料已审核过,确保内容和网页里介绍一致. 密 惠1.无需…

tostring 16进制_ToString:身份哈希码的十六进制表示形式

tostring 16进制我以前在方便的Apache Commons ToStringBuilder上写过博客&#xff0c;最近有人问我&#xff0c;在生成的String输出中出现的看似神秘的文本是什么构成的。 询问该问题的同事正确地推测出他正在查看的是哈希码&#xff0c;但与他的实例的哈希码不匹配。 我解释说…

前端工程师应该掌握哪些技能才方便找工作?

作为前端工程师,必须掌握到一定的技能才方便找工作,找高薪工作,你需要掌握这些技能。 高清思维导图下载:https://download.csdn.net/download/weixin_41937552/14752706 目录 HTML5+CSS3 移动Web网页开发

延迟分析中的案例研究:锁定与同步

特别是在这篇文章中&#xff0c;我们将讨论&#xff1a; java.concurrent.Lock创建的垃圾 比较锁与同步 如何以编程方式测量延迟 争用对锁和同步的影响 协调遗漏对延迟测试的影响 回到我最喜欢的主题之一&#xff0c;垃圾创建/分配。 有关此主题的更多详细信息&#xff0…

思维脑图——数据分析实战(最新版)

导读:数据分析是指用适当的统计分析方法对收集来的大量数据进行分析,提取有用信息和形成结论而对数据加以详细研究和概括总结的过程。 在统计学领域,将数据分析划分为描述性统计分析、探索性数据分析以及验证性数据分析,探索性数据分析侧重于在数据之中发现新的特征,而验证…

java实现一个旅游网站

导读:采用JSP和Java语言以及html脚本语言,同时采用B/S模式,进行各个界面和每个功能的设计与实现,后台管理与设计选用了SQL Server 2005数据库,前台设计与后台管理相结合,共同完成各功能模块的功能。 目录 基本功能 项目结构 项目截图

【收藏】Android屏幕适配全攻略(最权威的Google官方适配指导)

来源&#xff1a;http://blog.csdn.net/zhaokaiqiang1992 更多&#xff1a;Android AutoLayout全新的适配方式&#xff0c; 堪称适配终结者 Android的屏幕适配一直以来都在折磨着我们这些开发者&#xff0c;本篇文章以Google的官方文档为基础&#xff0c;全面而深入的讲解了And…