spock 集成测试_Spock 1.2 –轻松进行集成测试中的Spring Bean模拟

spock 集成测试

探索如何使用Spock 1.2将Spock的模拟和间谍自动注入到Spring上下文中。

Spock中的存根/模拟/间谍(及其生命周期)一直与Spock Specification类紧密结合。 只能在测试类中创建它们。 因此,使用共享的,预定义的模拟(在单元测试和集成测试中)是有问题的。

这种情况在Spock 1.1中有所改善,但只有在基于Spring的集成测试中使用Spock模拟子系统的全新Spock 1.2(撰写本文时为1.2-RC1)时,与使用@SpringMock进行Spring @SpringMock一样容易开机 让我们检查一下。

顺便说一句,除了Spock 1.2-RC1之外,为了更前沿,我将使用Spring Boot 2.1.0.M2,Spring 5.1.0.RC2和Groovy 2.5.2(但所有功能都应在Spring的稳定版本中使用(引导)和Groovy 2.4)。

斯波克

还有一件事。 为了简单起见,在本文中,我将使用术语“模拟”来指代存根和间谍。 它们的行为有所不同 ,但是在Spock测试中将其注入Spring上下文的范围通常并不重要。

Spock 1.1 –手动方式

多亏了LeonardBrünings的工作,Spock中的模拟才脱离了Specification类。 最终可以在外部创建它们,然后将其附加到正在运行的测试中。 这是在Spring(或任何其他)上下文中使用Spock模拟的基础。

在此示例代码中,我们有ShipDatabase类,该类使用OwnShipIndexEnemyShipIndex (当然是由构造函数注入的:))来返回有关所有与名称匹配的已知船只的汇总信息。

//@ContextConfiguration just for simplification, @(Test)Configuration is usually more convenient for Spring Boot tests
//Real beans can exist in the context or not
@ContextConfiguration(classes = [ShipDatabase, TestConfig/*, OwnShipIndex, EnemyShipIndex*/])
class ShipDatabase11ITSpec extends Specification {private static final String ENTERPRISE_D = "USS Enterprise (NCC-1701-D)"private static final String BORTAS_ENTERA = "IKS Bortas Entera"@Autowiredprivate OwnShipIndex ownShipIndexMock@Autowiredprivate EnemyShipIndex enemyShipIndexMock@Autowiredprivate ShipDatabase shipDatabasedef "should find ship in both indexes"() {given:ownShipIndexMock.findByName("Enter") >> [ENTERPRISE_D]enemyShipIndexMock.findByName("Enter") >> [BORTAS_ENTERA]when:List<String> foundShips = shipDatabase.findByName("Enter")then:foundShips == [ENTERPRISE_D, BORTAS_ENTERA]}static class TestConfig {private DetachedMockFactory detachedMockFactory = new DetachedMockFactory()@Bean@Primary    //if needed, beware of consequencesOwnShipIndex ownShipIndexStub() {return detachedMockFactory.Stub(OwnShipIndex)}@Bean@Primary    //if needed, beware of consequencesEnemyShipIndex enemyShipIndexStub() {return detachedMockFactory.Stub(EnemyShipIndex)}}
}

这些模拟是在单独的类中(在Specification之外)创建的,因此必须使用DetachedMockFactory (或使用SpockMockFactoryBean )。 这些模拟必须被附加(和分离)到测试实例( Specification实例),但是由spock-spring模块(从1.1版本开始)会自动处理。 对于从外部创建的通用MockUtil.attachMock() ,还需要使用MockUtil.attachMock()mockUtil.detachMock()使其起作用。

结果,可以在Spring上下文中创建和使用模拟,但是它不是很方便,也不常用。

Spock 1.2 –一流的支持

Spring Boot 1.4通过(Mockito)的模拟为集成测试带来了新的质量。 它利用了最初于2012年在Springockito中提出的想法(当时Spring配置主要是用XML编写的:))将模拟(或间谍)自动注入到Spring(引导)上下文中。 Spring Boot团队扩展了这个想法,并且由于有了它作为内部支持的功能(通常),因此只需在测试中添加一个或两个注释即可可靠地工作。

Spock 1.2中内置了类似的基于注释的机制。

//@ContextConfiguration just for simplification, @(Test)Configuration is usually more convenient for Spring Boot tests
//Real beans can exist in the context or not
@ContextConfiguration(classes = [ShipDatabase/*, OwnShipIndex, EnemyShipIndex*/])
class ShipDatabaseITSpec extends Specification {private static final String ENTERPRISE_D = "USS Enterprise (NCC-1701-D)"private static final String BORTAS_ENTERA = "IKS Bortas Entera"@SpringBeanprivate OwnShipIndex ownShipIndexMock = Stub()  //could be Mock() if needed@SpringBeanprivate EnemyShipIndex enemyShipIndexMock = Stub()@Autowiredprivate ShipDatabase shipDatabasedef "should find ship in both indexes"() {given:ownShipIndexMock.findByName("Enter") >> [ENTERPRISE_D]enemyShipIndexMock.findByName("Enter") >> [BORTAS_ENTERA]when:List<String> foundShips = shipDatabase.findByName("Enter")then:foundShips == [ENTERPRISE_D, BORTAS_ENTERA]}
}

没有太多要添加的内容。 @SpringBean指示Spock将模拟注入到Spring上下文中。 类似地, @SpringSpy用间谍包装真实的bean。 在@SpringBean的情况下,需要初始化一个字段以让Spock知道我们打算使用存根还是模拟。

另外,还有一个更通用的注释@StubBeans ,以存根替换所有已定义的bean。 但是,我计划在另一篇博客文章中单独介绍它。

局限性

对于那些希望在本文演讲后立即在您的Spock测试中将所有Mockito的模拟重写为Spock的模拟的人来说,这是一个警告。 Spock的模拟物-由于其性质和与Specification关系-具有某些局限性。 在幕后的实现创建了一个代理,该代理被注入到Spring上下文中(可能)替换实际的bean(存根/模拟)或包装它们(间谍)。 该代理在特定测试(规范)类中的所有测试之间共享。 实际上,在Spring能够缓存上下文的情况下,它也可以跨越具有相同bean / mock声明的其他测试(与Mockito的模拟或一般的Spring集成测试类似的情况)。

但是,真正重要的是,代理在执行之前就已连接到测试,并在执行之后被分离。 因此,实际上,每个测试都有其自己的模拟实例(不能应用于@Shared字段),例如,将来自不同测试的交互分组并一起验证它们是有问题的(通常是非常明智的,但可能会导致某些情况)复制)。 但是,使用setup块(或在线存根)可以共享存根和交互预期。

摘要

Spock 1.2最终带来了轻松的Spock存根/模拟/间谍支持,以便在Spring上下文中使用它们,这与Spring Boot中为Mockito提供的支持相当。 将spock-spring模块添加到项目(运行时)依赖项就足够了。 尽管有一些限制,但在Spock(集成)测试中将本机Spock的模拟子系统与外部模拟框架(例如Mockito)混合起来要少一点。 不错的是,它也应该在普通的Spring Framework测试中起作用(不仅是Spring Boot测试)。 Guice已实现了相同的功能(但我尚未对其进行测试)。

此外,Spock 1.2还带来了其他一些更改,包括对Java 9+的更好支持,值得在您的测试套件中进行尝试(当然,请报告任何可能发现的回归错误:))。

还有一个好消息。 除了使Spock 1.2成为可能的伦纳德的工作以及大量的错误报告者和PR贡献者之外,最近以来,还有其他一些提交者正在致力于使Spock变得更好。 您可能从其他一些流行的FOSS项目中了解了其中一些。 而且,Spock 1.2 (初步)计划成为基于JUnit 4的最后一个版本,而下一个稳定的Spock版本可能是2.0,这是利用JUnit 5及其(以及其他)并行运行测试的本机能力。

这些示例是使用Spock 1.2-RC1编写的。 一旦发布,它将更新为1.2-final。 源代码可从GitHub获得。

翻译自: https://www.javacodegeeks.com/2018/09/spock-spring-beans-mocking-integration.html

spock 集成测试

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

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

相关文章

dubbo中log4j检查(开发环境中建议设置为false)

一、在pom.xml里面引入依赖 1. 添加log4j文件 2. 文件内容 # Set root category priority to INFO and its only appender to CONSOLE. #log4j.rootCategoryINFO, CONSOLE debug info warn error fatal log4j.rootCategorydebug, CONSOLE, LOGFILE, info # Set…

Linux 命令之 useradd -- 添加用户

文章目录简介相关文件内容说明常用选项参考示例添加新用户 test添加新用户 test&#xff0c;且不创建家目录&#xff0c;并且禁止登陆添加新用户 test&#xff0c;指定 UID 为 888&#xff0c;指定归属用户组为 root&#xff0c;cool&#xff0c;其默认使用的 shell 类型为 /bi…

idea 构建spring_以Spring方式构建企业Java应用程序

idea 构建spring我认为可以说Java EE在Java开发人员中享有很高的声誉。 尽管多年来确实在各个方面都有所改善&#xff0c;甚至将其改名为Eclipse Foundation成为Jakarta EE &#xff0c;但其苦味仍然相当强烈。 另一方面&#xff0c;我们拥有Spring框架 &#xff08;或者为了更…

入门案例Maven搭建SpringBoot工程

一、引入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.…

Linux 命令之 passwd -- 修改用户账号密码

文章目录简介相关文件常用选项参考示例修改当前登陆的账户密码修改其他用户密码读取标准输入的值&#xff0c;设置成指定用户的密码锁定密码不允许用户修改解除锁定密码&#xff0c;允许用户修改下次登陆强制改密码清除登录密码。清除之后登录时无需密码&#xff0c;风险极大&a…

自动化测试特定区域滑动_自动化用户特定实体的访问控制

自动化测试特定区域滑动实际上&#xff0c;每个Web应用程序都应该有多个用户&#xff0c;并且每个用户都有一些数据-帖子&#xff0c;文档&#xff0c;消息等等。 最明显的事情是保护这些实体免遭非这些资源合法所有者的用户获取。 不幸的是&#xff0c;这不是最容易的事情。 …

Linux 命令之 usermod -- 用于修改用户的基本信息

文章目录命令介绍常用选项参考示例设置用户默认使用的shell类型将不能登录的用户改成可以登录的限定用户不能 shell 登录&#xff0c;只能 ftp修改用户的主目录更改用户的名称锁定用户的密码解锁用户的密码将用户添加到指定用户组命令介绍 usermod 命令用于修改用户的基本信息…

使用IDEA的Spring Initializr创建SpringBoot工程

一、创建步骤 二、创建完成后的界面 三、controller package com.william.day01_springboot_initializr.controller;import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;/*** author &#xff1…

Linux系统下MySQL的导入数据的命令语句Load Data InFile的用法详解

文章目录语法格式LOW_PRIORITYCONCURRENTLOCALREPLACE 或 IGNOREPARTITIONCHARACTER SET对导入文件的字段进行格式描述指定行的起始符号和终止符号IGNORE number LINES指定数据表的列名获取表达式的值存储到指定的列中开启/关闭功能参考示例示例一示例二示例三示例四示例五错误…

认证令牌_Java应用程序的简单令牌认证

认证令牌“我喜欢编写身份验证和授权代码。” 〜从来没有Web开发人员。 厌倦了一次又一次地建立相同的登录屏幕&#xff1f; 尝试使用Okta API进行托管身份验证&#xff0c;授权和多因素身份验证。 JSON Web令牌已Swift成为保护Web应用程序安全的标准&#xff0c;并取代了Cook…

SpringBoot配置文件与配置类的属性映射方式

一、在pom文件中加入依赖 目录结构 在实体类中会出现错误&#xff0c;然后点击这个网址会有需要的依赖 网址&#xff1a; https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/configuration-metadata.html#configuration-metadata-annotation-processor 引…

Linux 命令之 groupadd -- 新建用户群组

文章目录命令简介常用选项参考示例创建新的用户组创建系统用户组扩展知识命令简介 用于创建一个新的工作组&#xff0c;新工作组的信息将被添加到 /etc/group 文件中。 /etc/group 文件存储着系统所有的用户组信息&#xff0c;文件中每一行描述一个用户组信息&#xff0c;格式…

java获得电脑性能_Java:使用SingletonStream获得性能

java获得电脑性能仅具有一个元素的Java流有时会在应用程序中造成不必要的开销。 了解如何使用SingletonStream对象并为其中某些流获得十倍的性能&#xff0c;并了解如何同时简化代码。 背景 Java 8中的Stream库是迄今为止Java语言最强大的功能之一。 一旦您开始了解它的多功能…

SpringBoot与MyBatis技术集成

一 、创建project步骤 目录结构 pom依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"ht…

Linux 命令之 deluser -- 删除用户

文章目录命令简介常用选项参考示例删除普通用户将用户从用户组中删除删除用户的所有文件命令简介 deluser 命令用于删除用户。将一个用户从一个组中删除&#xff08;即退出用户组&#xff09;&#xff0c;大家都推荐用 usermod&#xff0c;其实 deluser 才是正解。deluser 的选…

ubuntu安装jdk语句_JDK 12:实际中的切换语句/表达式

ubuntu安装jdk语句我的上一篇文章“ 玩JDK 12的Switch表达式 ”讨论了使用JDK 12 Early Access Builds尝试JEP 325 switch 表达式和语句的过程&#xff0c;并提供了一个简单的示例。 这篇文章使用相同的JDK 12 Early Access Build 10来演示switch表达式和增强的switch语句的不同…

SpringBoot JPA

一、创建步骤 二、目录结构 三、application.properties配置datasource spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver spring.datasource.usernameroot spring.datasource.passwordroot spring.datasource.urljdbc:mysql://localhost/springboot?userUnicod…

Linux 命令之 userdel -- 用于删除给定的用户以及与用户相关的文件

文章目录命令简介常用选项参考示例删除用户命令简介 userdel 命令用于删除指定的用户及与该用户相关的文件&#xff0c;英文全称即“user delete”。在 Debian 上&#xff0c;我们通常会使用 deluser 命令。 其实 userdel 命令实际上是修改了系统的用户账号文件 /etc/passwd、…

RestTemplate入门案例

一、创建步骤注意事项 二、目录结构 三、RestTemplateApplication层 package com.william;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; …

java 示例_功能Java示例 第5部分–将I / O移到外部

java 示例这是称为“ Functional Java by Example”的系列文章的第5部分。 在上一部分中&#xff0c;我们停止了对文档的变异&#xff0c;并返回了数据的副本。 现在&#xff0c;我们需要移走一些I / O。 如果您是第一次来&#xff0c;最好是从头开始阅读。 它有助于了解我们…