在上一篇文章中 ,我写了关于如何使用Arquillian Cube和 Docker一起测试Spring Data应用程序的信息。 测试看起来像:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = PingPongController.class, webEnvironment = RANDOM_PORT)
@ContextConfiguration(initializers = PingPongSpringBootTest.Initializer.class)
public class PingPongSpringBootTest {@ClassRulepublic static ContainerDslRule redis = new ContainerDslRule("redis:3.2.6").withPortBinding(6379);@AutowiredTestRestTemplate restTemplate;@Testpublic void should_get_pongs() {// givenrestTemplate.postForObject("/ping", "pong", String.class);restTemplate.postForObject("/ping", "pung", String.class);// whenfinal List<String> pings = restTemplate.getForObject("/ping", List.class);// thenassertThat(pings).hasSize(2).containsExactlyInAnyOrder("pong", "pung");}public static class Initializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {@Overridepublic void initialize(ConfigurableApplicationContext configurableApplicationContext) {EnvironmentTestUtils.addEnvironment("testcontainers", configurableApplicationContext.getEnvironment(),"spring.redis.host=" + redis.getIpAddress(),"spring.redis.port=" + redis.getBindPort(6379));}}}

该测试只是启动Redis容器,然后使用restTemplatepost方法填充数据,然后执行被测逻辑(测试GET HTTP方法),最后停止Redis容器。
很好,它可以工作,但是那里有几个问题:<

  • 第一个是我们正在使用REST API准备测试的数据集。 这里的问题是,测试失败的原因可能不是因为被测代码失败,而是因为测试的准备工作(数据插入)。
  • 第二个问题是,如果POST端点更改了格式/位置,那么您需要记住在使用它的测试中的任何地方进行更改。
  • 最后一个是每个测试都应离开执行前的环境,因此该测试与所有执行隔离。 问题在于,要以这种方式执行此操作,您需要删除POST插入的先前元素。 这意味着添加DELETE HTTP方法,该方法可能并不总是在端点中实现,或者可能仅限于某些具体用户,因此需要处理特殊的身份验证事项。

为了避免此问题, 创建了Arquillian Persistence Extension (aka APE )。 这与DbUnit迁飞扩展集成了SQL数据库,为NoSQLUnit 没有SQL数据库和邮差集合REST服务,让您可以在测试,真正的考验的情况下使用前填充您的后端和执行测试后清理持久性存储。

此外,填充数据也存储在文件内,因此这意味着可以在所有测试中重复使用,并且在进行任何模式更新时可以轻松进行更改。
让我们看一下文章第1部分的示例,但将其更新为使用APE

@RunWith(SpringRunner.class)
@SpringBootTest(classes = PingPongController.class, webEnvironment = RANDOM_PORT)
@ContextConfiguration(initializers = PingPongSpringBootTest.Initializer.class)
public class PingPongSpringBootTest {@ClassRulepublic static ContainerDslRule redis = new ContainerDslRule("redis:3.2.6").withPortBinding(6379);@Rulepublic ArquillianPersistenceRule arquillianPersistenceRule = new ArquillianPersistenceRule();@AutowiredTestRestTemplate restTemplate;@Redis@ArquillianResourceNoSqlPopulator populator;@Testpublic void should_get_pongs() {// givenpopulator.forServer(redis.getIpAddress(), redis.getBindPort(6379)).usingDataSet("pings.json").execute();// whenfinal List<String> pings = restTemplate.getForObject("/ping", List.class);// thenassertThat(pings).hasSize(2).containsExactlyInAnyOrder("pong", "pung");}@Afterpublic void clean_database() {populator.forServer(redis.getIpAddress(), redis.getBindPort(6379)).clean();}public static class Initializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {@Overridepublic void initialize(ConfigurableApplicationContext configurableApplicationContext) {EnvironmentTestUtils.addEnvironment("testcontainers", configurableApplicationContext.getEnvironment(),"spring.redis.host=" + redis.getIpAddress(),"spring.redis.port=" + redis.getBindPort(6379));}}}

用于填充Redis实例的文件( pings.json )如下所示:

{"data" : [{"list" : [{"key" : "ping","values" : [{"value" : "pong"},{"value" : "pung"}]}]}]
}
请注意,在此测试中,您已将POST调用替换为直接插入到存储中的内容。 这样,您可以避免在插入逻辑(不是被测部件)中可能发生的任何故障。 最终,在每种测试方法之后,都会清理Redis实例,以便其他测试将Redis清理到已知状态。
该项目可以在https://github.com/arquillian-testing-microservices/pingpongbootredis中找到

翻译自: https://www.javacodegeeks.com/2017/05/testing-spring-data-spring-boot-applications-arquillian-part-2.html

使用Arquillian测试Spring Data + Spring Boot应用程序(第2部分)相关推荐

  1. 使用Arquillian测试Spring Data + Spring Boot应用程序(第1部分)

    Spring Data的使命是为数据访问提供一个熟悉且一致的,基于Spring的编程模型,同时仍保留基础数据存储的特​​殊特征. 它提供了与一些后端技术的集成,例如JPA,Rest,MongoDB,N ...

  2. Spring Data JPA例子[基于Spring Boot、Mysql]

    关于Spring Data Spring社区的一个顶级工程,主要用于简化数据(关系型&非关系型)访问,如果我们使用Spring Data来开发程序的话,那么可以省去很多低级别的数据访问操作,如 ...

  3. Spring Boot 2.x基础教程:使用Spring Data JPA访问MySQL

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 翟永超 来源 | http://blog.di ...

  4. Spring Boot 2.x基础教程:使用Spring Data JPA访问MySQL我们得从哪入手

    在数据访问这章的第一篇文章<Spring中使用JdbcTemplate访问数据库> 中,我们已经介绍了如何使用Spring Boot中最基本的jdbc模块来实现关系型数据库的数据读写操作. ...

  5. Spring Boot————Spring Data JPA简介

    引言 JPA是Java 持久化API的缩写,是一套Java数据持久化的规范, Spring Data Spring Data项目的目的是为了简化构建基于Spring 框架应用的数据访问技术,包括对关系 ...

  6. cassandra可视化_容器化Spring Data Cassandra应用程序

    cassandra可视化 我正在继续学习Docker的旅程. 在这一点上,我仍然保持简单. 这次,我将解决将Spring和Cassandra应用程序转换为使用容器而不是在主机上本地运行的问题. 更确切 ...

  7. 容器化Spring Data Cassandra应用程序

    我正在继续学习Docker的旅程. 在这一点上,我仍然保持简单. 这次,我将解决将Spring和Cassandra应用程序转换为使用容器而不是在主机上本地运行的问题. 更准确地说,使用Spring D ...

  8. 使用Spring Data访问MongoDB数据库

    本文将引导我们如何使用Spring Data MongoDB构建应用程序,并使用应用程序在MongoDB(基于文档的数据库)中存储数据与检索数据. 需要新建什么 我们要使用Spring Data Mo ...

  9. Spring Data JPA 实战

    课程介绍 <Spring Data JPA 实战>内容是基于作者学习和工作中实践的总结和升华,有一句经典的话:"现在的开发人员是站在巨人的肩上,弯道超车".因现在框架越 ...

最新文章

  1. 百度信息流和搜索业务中的弹性近线计算探索与应用
  2. UTXO Commitment有望彻底解决大区块存储问题
  3. html数据提交到python,将html页面数据发送到python flask variab
  4. 小学生python-如何看待小学生开始学Python?
  5. 100m和1000m网线的常见制作方法
  6. 工程师也是主播界“扛把子”,学员抱紧大腿痴痴等候百度AI快车道下期到来...
  7. redhat 挂载 iso文件 提示 mount :not a directory
  8. ASP.NET Core Web API 最佳实践指南
  9. Bellman-Ford算法和SPFA算法
  10. Swift中文教程(二十一) 协议
  11. Code Style of Mangata
  12. 【NLP之情感分析】华为云NLP算法专家:全面解读文本情感分析任务
  13. 最好用音频剪辑的软件,使用方法?
  14. html科学计算器,很剽悍的在线科学计算器
  15. 基于C的VAD实现一
  16. 数据挖掘十大经典算法,你都知道哪些?
  17. 苹果Mac电脑开机启动时的声音如何关闭?
  18. Deepin 15.4 如何使用 罗技无线键盘/鼠标(采用优联技术)
  19. KaliLinux装好系统后安装常用软件
  20. matlab symbol filled,策略交易 - MATLAB - 掘金量化

热门文章

  1. Java 程序员必须掌握的 5 个注解
  2. Jsoup代码解读之五-parser(中)
  3. Java多线程神器:join使用及原理
  4. 漫画:Bitmap算法 整合版
  5. mysq和mysqli关系
  6. 从0部署一个动态网站
  7. 用数组选出最大的数并且排序
  8. 20级、19级 | 一天一瞬间!【日更】
  9. sql server 2012远程链接的方法及步骤
  10. SpringBoot+Vue博客系统---后端接口开发