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

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

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

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

相关文章

生日祝福小程序_广告配音剪映零基础入门教程第二十六篇:如何给朋友制作生日祝福视频...

经常听到小伙伴问到生日祝福视频怎么做&#xff0c;当然我想既然要为他人做生日祝福视频&#xff0c;那么这个人必定是自己身边比较重要的人&#xff0c;而生日又是每个人都是非常重要的&#xff0c;在这种充满意义的时刻&#xff0c;我们想给自己极其重要的人送上一份祝福&…

putty WinScp 免密登录远程 Linux

该方法的原理是预先生成一对公钥和私钥&#xff0c;私钥以文件的形式保存在本地&#xff0c;公钥保存在远程机器上。这样每次登录只需指定私钥文件&#xff0c;远程机器通过比对公钥和私钥来验证登录的合法性。 Putty 免密登录 第一步 生成公钥/私钥对 使用 putty 安装目录中的…

tensorflow log 日志级别设置

log 日志级别设置 import os os.environ["TF_CPP_MIN_LOG_LEVEL"]1 # 这是默认的显示等级&#xff0c;显示所有信息 os.environ["TF_CPP_MIN_LOG_LEVEL"]2 # 只显示 warning 和 Error os.environ["TF_CPP_MIN_LOG_LEVEL"]3 # 只显示 Error

springcloud微服务实战--笔记--1、基础知识

微服务的问题&#xff1a; 分布式事务和数据一致性。 由于分布式事务本身第实现难度就非常大&#xff0c;所以在微服务架构中&#xff0c;我们更强调在各服务之间进行无事务第调用&#xff0c;而对于数据一致性&#xff0c;只要求数据在最后第处理状态是一致第即可&#xff1b;…

OpenCV imwrite

imwrite(const string& filename, InputArray img, const vector<int>& paramsvector<int>() ) 1、filename:需要写入的文件名&#xff0c;会自己创建&#xff08;像imwrite("1.jpeg",src);这样&#xff09; 2、img:要保存的图像 3、pa…

配置Jenkins以连续交付Spring Boot应用程序

在我以前的文章中&#xff0c;我描述了如何使用一个简单的命令启动连续交付堆栈 。 下一步是准备堆栈&#xff0c;以自动方式构建和部署应用程序。 在这篇文章中&#xff0c;我描述了如何配置堆栈&#xff0c;以便准备处理简单的Spring Boot应用程序 。 尽管我将这些组件作为Do…

虚拟鼠标代替安卓触屏_美术学院18级虚拟空间设计专业数字图像程序基础课程优秀结课成果展示优秀学生王雨禾作品展示...

学生代表&#xff1a;STUDENT REPRESENTATIVE|2018级虚拟空间设计专业 王雨禾此次编程课程的学习&#xff0c;让我受益匪浅&#xff0c;短短八周的时间&#xff0c;使我进一步加深了对自身专业的了解&#xff0c;也启发了我&#xff0c;提供给我一种新的创作方式和新的创作表现…

django定时任务

说明 网上很多资料都是比较旧的&#xff0c;不同的版本使用上存在差异&#xff0c;最好的方式是&#xff0c;根据使用的版本查看官方资料 django-celery-beat 用法和django-celery类似 INSTALLED_APPS [django_celery_beat] BEAT_SCHEDULER django_celery_beat.schedulers:Da…

LOG与DOG的关系

注意&#xff1a;这里只是推出LOG与DOG的关系 1&#xff09;高斯函数&#xff1a; &#xff08;1&#xff09; 2&#xff09;DOG&#xff08;Difference Of Gaussian&#xff09; DoG算子是LoG算子的近似&#xff0c;做法是求取不同sigma方差下的高斯滤波图像的差&#xff0c…

springboot springcloud区别_SpringBoot回顾、Spring Cloud初学

Spring Cloud介绍什么是Spring Cloud&#xff1f;Spring Cloud是一系列框架的有序集合。 它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发&#xff0c;如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等&#xff0c;都可以用Spring Boot的…

时间 '2018-08-06T10:00:00.000Z' 格式转化为本地时间(转)

原文:https://blog.csdn.net/sxf_123456/article/details/81582964 from datetime import datetime,timedelta #bucket[key_as_string] 2018-08-06T10:00:00.000Z date_ datetime.strptime(bucket[key_as_string],"%Y-%m-%dT%H:%M:%S.%fZ") #local_time 2018-08-0…

OpenCV minMaxLoc找图像中最小值最大值及它们的位置

void minMaxLoc(InputArray src, double* minVal, double* maxVal0, Point* minLoc0, Point* maxLoc0, InputArray masknoArray()) src&#xff1a;输入图像。 minVal&#xff1a;最小值&#xff0c;可輸入NULL表示不需要。 maxVal &#xff1a;最大值&#xff0c;可輸入NUL…

python无法打开hdf5_保存到hdf5非常慢(Python冻结)

我正在尝试将瓶颈值保存到新创建的hdf5文件中.瓶颈值分批形成(120,10,10,2048).保存一个单独的批次占用超过16个演出,python似乎在那一批冻结.根据最近的调查结果(见更新,似乎hdf5占用大内存是可以的,但冻结部分似乎是一个小故障.我只是试图保存前两批用于测试目的,而且仅用于测…

python request 留位置4

测试 转载于:https://www.cnblogs.com/syw20170419/p/11008870.html

收藏表数据库_选择您的收藏库

收藏表数据库这真的是您应该烦恼的吗&#xff1f; java.util.ArrayList和java.util.HashMap从根本上有问题吗&#xff1f; 对于大多数源代码&#xff0c;答案是–不&#xff1b; 这些实现完全可以。 但是&#xff0c;一如既往&#xff0c;细节决定成败。 并存在情况下&#x…

matlab norm向量和矩阵的范数

一、向量的范数 首先定义一个向量为&#xff1a;a[-5&#xff0c;6&#xff0c;8, -10] 1.1 向量的1范数 向量的1范数即&#xff1a;向量的各个元素的绝对值之和&#xff0c;上述向量a的1范数结果就是&#xff1a;29&#xff0c;MATLAB代码实现为&#xff1a;norm&#xff08;…

不能启动的问题 社区版安装后_CentOS7下安装docker(亲测+完整)

说明&#xff1a;1、docker要求Centos系统内核高于3.10&#xff0c;安装前先验证你的Centos版本是否支持docker&#xff1b;2、docker有两个分支版本&#xff1a;docker CE和docker EE&#xff0c;即社区版和企业版&#xff0c;自学研究建议使用社区版本&#xff1b;本文章介绍…

关于数据可视化页面制作

先出思路 数据可视化&#xff0c;目的是为了让纷繁的数据变得直观&#xff0c;更易领会数据代表的趋势、模型等。既然是带着目的的&#xff0c;应先把目标明确下来。目标写下来&#xff0c;思想上算落地了&#xff0c;那么就能给大脑腾出继续深入或扩展的空间。所以&#xff0c…

GitHub Research:超过50%的Java记录语句写错了

为什么生产日志无法帮助您找到错误的真正根本原因&#xff1f; 询问您是否使用日志文件监视您的应用程序几乎就像询问…您是否喝水。 我们都使用日志&#xff0c;但是我们如何使用它们则是一个完全不同的问题。 在下面的文章中&#xff0c;我们将对日志进行更深入的研究&…

matlab rgb2gray的实现

rgb2gray是matlab内部一种处理图像的函数&#xff0c;通过消除图像色调和饱和度信息同时保留亮度实现将将RGB图像或彩色图转换为灰度图像&#xff0c;即灰度化处理的功能&#xff0c;调用这个功能的格式是I rgb2gray(RGB)&#xff0c;意思是将真彩色图像RGB转换为灰度强度图像…