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

因此,如果您使用的是Spring(引导),那么Spring Data是处理持久层的正确选择。

在下一个示例中,您可以看到使用Spring BootSpring Data Redis有多么简单。

@Controller
@EnableAutoConfiguration
public class PingPongController {@AutowiredStringRedisTemplate redisTemplate;@RequestMapping("/{ping}")@ResponseBodyList<String> getPong(@PathVariable("ping") String ping) {final ListOperations<String, String> stringStringListOperations = redisTemplate.opsForList();final Long size = stringStringListOperations.size(ping);return stringStringListOperations.range(ping, 0, size);}@RequestMapping(value="/{ping}", method = RequestMethod.POST)ResponseEntity<?> addPong(@PathVariable("ping") String ping, @RequestBody String pong) {final ListOperations<String, String> stringStringListOperations = redisTemplate.opsForList();stringStringListOperations.leftPushAll(ping, pong);URI location = ServletUriComponentsBuilder.fromCurrentRequest().buildAndExpand(ping).toUri();return ResponseEntity.created(location).build();}public static void main(String[] args) {SpringApplication.run(PingPongController.class, args);}}
@Configuration
public class RedisConfiguration {@BeanStringRedisTemplate template(final RedisConnectionFactory connectionFactory) {return new StringRedisTemplate(connectionFactory);}}

这是通知,缺省时,Spring数据Redis的配置连接到本地主机和端口6379的重要,但是你可以重写通过设置系统属性(spring.redis.hostspring.redis.port)或环境变量这些值(SPRING_REDIS_HOSTSPRING_REDIS_PORT )。

但是现在是时候为这段代码编写测试了。 您可能会遇到的主要问题是,需要在所有需要执行这些测试的机器(例如开发人员机器或Jenkins从站)中安装Redis服务器。

这本身不是问题,但是当您开始处理越来越多的项目时,您将需要在系统上安装越来越多的数据库,甚至更糟糕的是,与生产所需的版本也不完全相同。

为了避免这个问题,一种可能的解决方案是使用Docker和容器。 因此,您无需依赖于在系统上安装每个数据库,而仅依赖Docker 。 然后,测试仅启动存储库容器,在我们的示例中为Redis,执行测试,最后停止容器。

这就是Arquillian (和Arquillian Cube )在帮助您自动化所有事情的地方。
Arquillian CubeArquillian扩展,可用于管理Arquillian的 Docker容器

要使用Arquillian Cube,您需要在计算机上运行Docker守护程序(它可以是本地的,也可以不是本地的),但是可能是在本地。

默认情况下, Docker服务器使用UNIX套接字与Docker客户端进行通信。 Arquillian Cube将尝试检测其正在运行的操作系统,并将docker -java设置为在Linux上使用UNIX套接字,或者将Windows / Mac上的Boot2Docker / Docker-Machine设置为默认URI,因此您的测试可在多个Docker安装之间移植而且您无需担心对其进行配置, Arquillian Cube可以适应您所安装的内容。
Arquillian Cube提供了三种定义容器的不同方法。

  • 定义docker-compose文件。
  • 定义一个容器对象
  • 使用容器对象DSL

在本文中,使用的是Container Object DSL方法。 要定义一个容器,该容器要在执行测试之前启动,而在编写后只需要停止一段代码之后就停止。

@ClassRule
public static ContainerDslRule redis = new ContainerDslRule("redis:3.2.6").withPortBinding(6379);

在这种情况下,将使用JUnit规则来定义测试中应使用的映像( redis:3.2.6 ),并将Redis端口( 6379 )添加为绑定端口。

完整的测试如下所示:

@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));}}}

注意,这是一个使用它们的位和鲍勃进行的简单Spring Boot测试,但是测试中使用Arquillian Cube JUnit Rule来启动和停止Redis映像。

最后要注意的一点是,测试包含ApplicationContextInitializer的实现,因此我们可以使用Docker数据(Redis容器的主机和绑定端口)配置环境,以便Spring Data Redis可以连接到正确的实例。

最后但并非最不重要的build.gradle文件定义所需的依赖项,如下所示:

buildscript {repositories {jcenter()mavenCentral()}dependencies {classpath("org.springframework.boot:spring-boot-gradle-plugin:1.5.2.RELEASE")}
}plugins {id "io.spring.dependency-management" version "1.0.2.RELEASE"
}apply plugin: 'java'
apply plugin: 'org.springframework.boot'repositories {jcenter()
}project.version = '1.0.0'dependencyManagement {imports {mavenBom 'org.jboss.arquillian:arquillian-bom:1.1.13.Final'}
}dependencies {compile "org.springframework.boot:spring-boot-starter-web:1.5.2.RELEASE"compile 'org.springframework.boot:spring-boot-starter-data-redis:1.5.2.RELEASE'testCompile 'org.springframework.boot:spring-boot-starter-test:1.5.2.RELEASE'testCompile 'junit:junit:4.12'testCompile 'org.arquillian.cube:arquillian-cube-docker-junit-rule:1.2.0'testCompile 'org.assertj:assertj-core:3.6.2'
}
您可以在http://arquillian.org/arquillian-cube/上了解有关Arquillian Cube的更多信息。

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

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

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

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

  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. 英特尔近日发布最新版实感™ SDK R5 (v7)
  2. 局域网ip地址不够用怎么解决?
  3. 用python批量创建docker_「docker实战篇」python的docker-docker镜像的创建使用dockerfile(3...
  4. python【5】-生成式,生成器
  5. magenta内核与linux,谷歌将推出新操作系统Fuchsia:Magenta语言为内核
  6. 关于事件委托的整理 ,另附bind,live,delegate,on区别
  7. Docker实践(二)镜像
  8. ps导出gif颜色不对_PS の手绘《超详细的动态表情包新手绘制指南》
  9. IDEA配置好maven后新建maven项目一直build失败的解决方法
  10. 一位寒门博士的致谢,女友回复...
  11. 广播风暴检测_什么是广播路由算法?如何解决广播风暴?
  12. php实现读写ic卡,diy用PIC单片机实现的IC卡读写器
  13. Vue3+elementplus搭建通用管理系统实例五:后台主页搭建上
  14. 分享一些嵌入式相关的开源项目
  15. Use of Deep Learning in Modern Recommendation System: A Summary of Recent Works(笔记)
  16. 爬虫实战2(下):爬取豆瓣影评
  17. 按例学construct2_滚动背景制作 (一)
  18. Android开发之安全彻底的修改包名
  19. 单片机c语言数字频率计的课程设计,基于单片机的简易数字频率计设计报告(最终版)最新版...
  20. 已解决(Python cn2an库实现中文数字与阿拉伯数字互转)ValueError: mode 仅支持 [‘low‘, ‘up‘, ‘rmb‘, ‘direct‘]

热门文章

  1. 解决eclipse中jsp没有代码提示问题
  2. HikariCP-史上最快速的连接池
  3. 小白学数据:教你用Python实现简单监督学习算法
  4. uni-app打包h5
  5. java中input表单中的type=date返回类型【切记】
  6. ssm(Spring+Spring mvc+mybatis)Dao层实现类——DeptDaoImpl
  7. React中判断已完成的个数
  8. 2018蓝桥杯省赛---java---C---1(哪天返回)
  9. html5 block调用html,HTML: blockquote 标签
  10. IntelliJ IDEA 项目结构旁边出现 0%methods,0% lines covered 解决