海南省住房和城乡建设部网站,wordpress图片显示,企查查企业信息查询系统官网,做网站贵不探索如何使用Spock 1.2将Spock的模拟和间谍自动注入到Spring上下文中。 Spock中的存根/模拟/间谍#xff08;及其生命周期#xff09;一直与Spock Specification类紧密结合。 只能在测试类中创建它们。 因此#xff0c;使用共享的预定义模拟#xff08;在单元测试和集成测… 探索如何使用Spock 1.2将Spock的模拟和间谍自动注入到Spring上下文中。 Spock中的存根/模拟/间谍及其生命周期一直与Spock Specification类紧密结合。 只能在测试类中创建它们。 因此使用共享的预定义模拟在单元测试和集成测试中是有问题的。 这种情况在Spock 1.1中有所改善但只有在基于Spring的集成测试中使用Spock模拟子系统的全新Spock 1.2撰写本文时为1.2-RC1时与在Spring中对Mockito模拟使用SpringMock一样容易开机 让我们检查一下。 顺便说一句除Spock 1.2-RC1之外为了更前沿我将使用Spring Boot 2.1.0.M2Spring 5.1.0.RC2和Groovy 2.5.2但所有功能都应在Spring的稳定版本中使用引导和Groovy 2.4。 还有一件事。 为了简单起见在本文中我将使用术语“模拟”来指代存根和间谍。 它们的行为有所不同 但是在Spock测试中将其注入Spring上下文的范围通常并不重要。 Spock 1.1 –手动方式 多亏了LeonardBrünings的工作Spock中的模拟才脱离了Specification类。 最终可以在外部创建它们然后将其附加到正在运行的测试中。 这是在Spring或任何其他上下文中使用Spock模拟的基础。 在此示例代码中我们具有ShipDatabase类该类使用OwnShipIndex和EnemyShipIndex 当然是由构造函数注入的来返回有关所有与名称匹配的已知船只的汇总信息。 //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 EnteraAutowiredprivate OwnShipIndex ownShipIndexMockAutowiredprivate EnemyShipIndex enemyShipIndexMockAutowiredprivate ShipDatabase shipDatabasedef should find ship in both indexes() {given:ownShipIndexMock.findByName(Enter) [ENTERPRISE_D]enemyShipIndexMock.findByName(Enter) [BORTAS_ENTERA]when:ListString foundShips shipDatabase.findByName(Enter)then:foundShips [ENTERPRISE_D, BORTAS_ENTERA]}static class TestConfig {private DetachedMockFactory detachedMockFactory new DetachedMockFactory()BeanPrimary //if needed, beware of consequencesOwnShipIndex ownShipIndexStub() {return detachedMockFactory.Stub(OwnShipIndex)}BeanPrimary //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 EnteraSpringBeanprivate OwnShipIndex ownShipIndexMock Stub() //could be Mock() if neededSpringBeanprivate EnemyShipIndex enemyShipIndexMock Stub()Autowiredprivate ShipDatabase shipDatabasedef should find ship in both indexes() {given:ownShipIndexMock.findByName(Enter) [ENTERPRISE_D]enemyShipIndexMock.findByName(Enter) [BORTAS_ENTERA]when:ListString 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的更好支持值得在您的测试套件中进行尝试当然请报告任何可能发现的回归bug 。 还有一个好消息。 除了使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