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

junit测试spring

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创建参数化测试(这并不是很困难的BTW)。

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

junit测试spring

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

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

相关文章

不属于python的数据类型_下列________不是Python的数据类型。

【判断题】已知 x, y 3, 5,那么执行x, y y, x 之后,x的值为15。【多选题】Python 中对变量描述正确的选项是( )【单选题】字符串是一个连续的字符序列,用________方式打印出可以换行的字符串。【多选题】以下选项中,不符合 Python 语言变量命名规则的有( )【多选题】Python的…

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

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

C语言为何不会过时

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删评价任何一门编程语言&#xff0c;都是招人骂的。永远是这样。就像是春寒料峭的季节&#xff0c; 街上穿棉袄和穿单衣的擦肩而过&#xff0c;双方…

下列选项中不属于python循环语句的是哪一项_下列选项中,不属于字典操作的方法是哪一项?_学小易找答案...

【简答题】字符串有哪几种表现形式?【简答题】简述Python程序的执行过程。【单选题】Python 语句x‘char’;y2,print(xy)输出的结果是哪一项?()【编程题】输入三角形的边长和高,计算并输出三角形的面积。【简答题】手机插上充电器却没有显示充电,可以用万用表检测吗?请上网搜…

mysql 死锁监视器_并发基础知识:死锁和对象监视器

mysql 死锁监视器本文是我们名为Java Concurrency Essentials的学院课程的一部分。 在本课程中&#xff0c;您将深入探讨并发的魔力。 将向您介绍并发和并发代码的基础知识&#xff0c;并学习诸如原子性&#xff0c;同步和线程安全性的概念。 在这里查看 &#xff01; 目录 …

python ks值计算_利用Python计算KS的实例详解

在金融领域中&#xff0c;我们的y值和预测得到的违约概率刚好是两个分布未知的两个分布。好的信用风控模型一般从准确性、稳定性和可解释性来评估模型。sOf免费资源网一般来说。好人样本的分布同坏人样本的分布应该是有很大不同的&#xff0c;KS正好是有效性指标中的区分能力指…

教你如何用一句话激怒IT人

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删在IT行业摸爬滚打这么久&#xff0c;你是否听过下面这些话&#xff1a;“这个很简单&#xff0c;我也是做程序出身的。”“预算砍掉一半&#xf…

java的网络编程有用吗_十大有用但又偏执的Java编程技术

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

python bootstrap 4_Python3.4+Django1.9+Bootstrap3

实现和原理Python集成Django开发框架后&#xff0c;可以通过在cmd命令提示符下建立工程&#xff0c;工程名为learn_modelsdjango-admin.py startproject learn_models再进入到learn_models里面&#xff0c;新建一个app项目cd learn_modelspython manage.py startapp learn此时目…

未来五年有颠覆性的IT技术都在这里

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删据福布斯杂志报道&#xff0c;在美国奥兰多举行的Gartner研讨会上&#xff0c;市场研究机构Gartner Research的副总裁兼资深研究员大卫卡利&…

java ee maven_真正释放Maven和Java EE的强大功能

java ee maven如果野心和愿景太复杂而无法使用&#xff0c;则它们可能会淘汰伟大的解决方案。 尽管Maven和Java EE是在整个Java行业中都已建立的良好技术&#xff0c;但是使用它们并使用其作者打算使用的所有技术和模式来设计项目可能非常棘手。 在开发过程中途&#xff0c;由…

python字符串解释_python基础之字符串详解

1、Python环境配置&#xff1a;下载好之后安装&#xff0c;注意勾选环境变量。2、写python一定要注意代码的缩进。2、字符串&#xff1a;(1)、字符串是从左到右是从0开始索引&#xff0c;从右到左是从-1开始。遵循包前不包后原则。举例说明&#xff1a;代码&#xff1a; …

程序员们,想在双十一脱单?赶快跟我捯饬起来吧

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删生活中有很多男人一边抱怨自己不够洋气&#xff0c;找不到女票&#xff0c;另一方面又懒到宁肯在床上撸啊撸&#xff0c;也不愿意好好打扮自己。…

jboss8日志级别设置_罐中研讨会:设置JBoss BRMS全日研讨会

jboss8日志级别设置是否在寻找一种简单的方法来宣传&#xff0c;展示或演示使用JBoss业务规则管理系统&#xff08;BRMS&#xff09;产品的入门难度&#xff1f; 别无所求&#xff0c;因为我们已经召集了这个研讨会&#xff0c;因此您可以围绕JBoss BRMS构建一个晚上&#xff…

python具有伪代码的本质吗_Python的优点之一是具有伪代码的本质。( )_学小易找答案...

【单选题】下面关于函数的说法,错误的是( )。【单选题】实际开发中,文件或者文件夹操作都要用到os模块。( )【单选题】函数能处理比声明时更多的参数,它们是( ) 参数。【单选题】函数的名称可以随意命名。( )【单选题】Python源代码被解释器转换后的格式为( )。【单选题】Pytho…

C语言编程时你常犯的18种错误

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删C语言的最大特点是&#xff1a;功能强、使用方便灵活。C编译的程序对语法检查并不象其它高级语言那么严格&#xff0c;这就给编程人员留下“灵活…

python字典items返回什么_Python 字典items返回列表,iteritems返回迭代器

说明&#xff1a;items以列表方式返回字典中的键值对&#xff0c;iteritems以迭代器对象 返回键值对儿(Python3中不再支持)&#xff1b;字典items()方法和iteritems()方法&#xff0c;是python字典的内建函数&#xff0c;分别会返回列表和迭代器&#xff0c;下面一起来看下字典…

pl/postgresql_将PostgreSQL PL / Java安装为PostgreSQL扩展

pl/postgresql在2011年&#xff0c;我在PostgreSQL PL / Java上撰写了一系列文章。 基本信息仍然可靠&#xff0c;但是现在有了一种从源代码安装PL / Java的简便得多的方法。 这也消除了依赖第三方来创建软件包的需要。 由于我的读者已经熟悉git和maven&#xff0c;因此这些注释…

这些知识你都不知道,难怪说你学不懂C语言!

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删关于C语言的那些小知识&#xff0c;准备学习或者刚刚入门的你已经了解了吗&#xff1f;语言种类编译语言静态声明语言面向过程的编程语言环境工具…

图片识别出处_AI人脸识别

前言最近网络上爆火的藏族小哥哥丁真&#xff0c;大家都知道吗&#xff1f;十几天前凭借一张纯真、干净、帅气的脸霸屏各大短视频平台&#xff0c;连各大电视台新闻媒体都争相报道&#xff0c;这个藏族小伙瞬间火了&#xff01;&#xff01;网友们对于丁真的长相评价不一&#…