TestContainers和Spring Boot

TestContainers太棒了! 它提供了一种非常方便的方式来启动和清除JUnit测试中的Docker容器。 此功能对于将应用程序与实际数据库以及可使用docker映像的任何其他资源进行集成测试非常有用。

我的目标是演示使用TestContainers对基于JPA的Spring Boot Application进行示例测试。 该示例基于TestContainer github repo上的示例 。

示例应用

基于Spring Boot的应用程序非常简单–它是基于Spring Data JPA的应用程序,其Web层使用Spring Web Flux编写。 完整的示例可在我的github存储库中找到 ,直接在此处直接遵循代码可能会更容易。

被保留的City实体如下所示(使用Kotlin ):

import javax.persistence.Entity
import javax.persistence.GeneratedValue
import javax.persistence.Id@Entity
data class City(@Id @GeneratedValue var id: Long? = null,val name: String,val country: String,val pop: Long
) {constructor() : this(id = null, name = "", country = "", pop = 0L)
}

由于出色的Spring Data JPA项目,提供一个用于管理该实体的存储库所需的就是以下接口:

import org.springframework.data.jpa.repository.JpaRepository
import samples.geo.domain.Cityinterface CityRepo: JpaRepository<City, Long>

我不会在此处介绍Web层,因为它与讨论无关。

测试存储库

Spring Boot提供了一种称为切片测试的功能,这是一种测试应用程序不同水平切片的好方法。 CityRepo存储库的测试如下所示:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.test.context.junit4.SpringRunner;
import samples.geo.domain.City;
import samples.geo.repo.CityRepo;import static org.assertj.core.api.Assertions.assertThat;@RunWith(SpringRunner.class)
@DataJpaTest
public class CitiesWithEmbeddedDbTest {@Autowiredprivate CityRepo cityRepo;@Testpublic void testWithDb() {City city1 = cityRepo.save(new City(null, "city1", "USA", 20000L));City city2 = cityRepo.save(new City(null, "city2", "USA", 40000L));assertThat(city1).matches(c -> c.getId() != null && c.getName() == "city1" && c.getPop() == 20000L);assertThat(city2).matches(c -> c.getId() != null && c.getName() == "city2" && c.getPop() == 40000L);assertThat(cityRepo.findAll()).containsExactly(city1, city2);}}

“ @DataJpaTest”注释将启动嵌入式h2数据库,配置JPA并加载任何Spring Data JPA存储库(在此示例中为CityRepo)。

考虑到JPA提供了数据库抽象,并且如果正确使用JPA,则该代码应可跨任何受支持的数据库移植,因此这种测试效果很好。 但是,假设此应用程序有望在生产环境中针对PostgreSQL运行,那么理想情况下,将针对数据库进行某种级别的集成测试,这正是TestContainer所适合的。它提供了一种以docker方式启动PostgreSQL的方法。容器。

测试容器

使用TestContainers的相同存储库测试如下所示:

import org.junit.ClassRule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.boot.test.util.TestPropertyValues;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
import org.testcontainers.containers.PostgreSQLContainer;
import samples.geo.domain.City;
import samples.geo.repo.CityRepo;import java.time.Duration;import static org.assertj.core.api.Assertions.assertThat;@RunWith(SpringRunner.class)
@DataJpaTest
@ContextConfiguration(initializers = {CitiesWithPostgresContainerTest.Initializer.class})
public class CitiesWithPostgresContainerTest {@ClassRulepublic static PostgreSQLContainer postgreSQLContainer =(PostgreSQLContainer) new PostgreSQLContainer("postgres:10.4").withDatabaseName("sampledb").withUsername("sampleuser").withPassword("samplepwd").withStartupTimeout(Duration.ofSeconds(600));@Autowiredprivate CityRepo cityRepo;@Testpublic void testWithDb() {City city1 = cityRepo.save(new City(null, "city1", "USA", 20000L));City city2 = cityRepo.save(new City(null, "city2", "USA", 40000L));assertThat(city1).matches(c -> c.getId() != null && c.getName() == "city1" && c.getPop() == 20000L);assertThat(city2).matches(c -> c.getId() != null && c.getName() == "city2" && c.getPop() == 40000L);assertThat(cityRepo.findAll()).containsExactly(city1, city2);}static class Initializerimplements ApplicationContextInitializer<ConfigurableApplicationContext> {public void initialize(ConfigurableApplicationContext configurableApplicationContext) {TestPropertyValues.of("spring.datasource.url=" + postgreSQLContainer.getJdbcUrl(),"spring.datasource.username=" + postgreSQLContainer.getUsername(),"spring.datasource.password=" + postgreSQLContainer.getPassword()).applyTo(configurableApplicationContext.getEnvironment());}}
}

代码的核心与先前的测试相同,但是此处的存储库正在针对此处的真实PostgreSQL数据库进行测试。 更详细一点-

正在使用JUnit类规则来启动PostgreSQL容器,该规则会在运行任何测试之前触发。 使用以下类型的gradle依赖项来拉入此依赖项:

testCompile("org.testcontainers:postgresql:1.7.3")

类规则将启动PostgreSQL docker容器(postgres:10.4)并配置数据库和数据库凭据。 现在从Spring Boot的角度来看,这些细节需要在属性开始传递给应用程序之前,即Spring开始为要运行的测试创建测试上下文之前,这是使用ApplicationContextInitializer为测试完成的,Spring在很早的时候就调用了它。 Spring Context的生命周期。

使用以下代码将用于设置数据库名称,URL和用户凭据的自定义ApplicationContextInitializer连接到测试:

...
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
...@RunWith(SpringRunner.class)
@DataJpaTest
@ContextConfiguration(initializers = {CitiesWithPostgresContainerTest.Initializer.class})
public class CitiesWithPostgresContainerTest {
...

设置好样板后,TestContainer和Spring Boot slice测试将接管测试的运行。 更重要的是,TestContainers还负责拆卸,JUnit类规则可确保测试完成后立即停止并删除容器。

结论

这是一次TestContainers的旋风之旅,TestContainers的功能远不止我在这里介绍的内容,但我希望这为使用此优秀库以及如何使用Spring Boot进行配置提供了可能。 这个示例可以在我的github仓库中找到

翻译自: https://www.javacodegeeks.com/2018/05/testcontainers-and-spring-boot.html

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

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

相关文章

【模式识别】信号检测实验及MATLAB仿真

一、 参数 高斯噪声均值 u = 0 u = 0 u=0,方差 σ = 1 \sigma =

【模式识别】Fisher线性判别实验报告之MATLAB仿真

一、 参数 1.题设三个类,每个类均有10个样本,分别为w1,w2,w3,因此采用两两互相分类,最后得出结果; 2.三类样本的均值向量依次为m1,m2,m3; 3.三类样本的类内离散度矩阵依次为S1,S2,S3; 4.对于w1和w2,总类内离散度矩阵为Sw12,类间离散度矩阵为Sb12,通过矩阵特…

不知所措:您是否真的需要为您的API提供客户端库?

RESTful Web服务和API的优点在于&#xff0c;任何使用HTTP协议的使用者都可以理解和使用它。 但是&#xff0c;同样的难题一遍又一遍地弹出&#xff1a;您是否应该将Web APis与客户端库一起使用&#xff1f; 如果是&#xff0c;您应该支持哪些语言或/和框架&#xff1f; 通常这…

【模式识别】K均值聚类算法应用实验报告及MATLAB仿真

一、 实验目的 1.掌握K均值聚类算法的原理和实现过程; 2.掌握K均值聚类算法的应用方法。 二、 实验内容 1.彩色图像分割 选择一幅图像,分别按三种颜色数进行彩色图像分割的结果(原图和分割图)。步骤如下: (1) 第一步:读入一幅rgb图像并显示; (2) 第二步:将该幅图…

【模式识别】特征评价和可分性判据实验报告及MATLAB仿真

一、 实验目的 1.掌握几种常用的特征评价方法和可分性判据; 2.解图像阈值分割中几种确定阈值的方法。 二、 实验原理 假设图像中出现的最大灰度级为m,阈值为g,目标部分灰度均值为mean1,像素数占整个图像比例为w1;背景部分灰度均值为mean2,像素数占整个图像比例为w2。…

web应用插件开发_Web应用程序的简单插件系统

web应用插件开发我们需要制作多个具有很多共享功能的基于Web的项目。 为此&#xff0c;某种插件系统将是一个不错的选择&#xff08;作为粘贴粘贴内容的替代方法&#xff09;。 有些框架&#xff08;例如grails&#xff09;可以选择制作Web插件&#xff0c;但大多数没有&#x…

【自适应盲均衡2】多径衰落信道的复数常模算法(CMA)的理论推导与MATLAB仿真

关注公号【逆向通信猿】更精彩!!! 关于均衡的基础知识,首先可参考本人博客 LMMSE、Godard、CMA常模、Sato等算法在信道均衡中的应用理论与MATLAB仿真 理论推导 代价函数 J = E [ e G o d a r d p

【自适应盲均衡3】多模算法(MMA)——复数改进常模算法(MCMA)的理论推导与MATLAB仿真

关注公号【逆向通信猿】更精彩!!! 接上篇【自适应均衡2】多径衰落信道的复数常模算法(CMA)的理论推导与MATLAB仿真 理论推导 MMA或者MCMA其实是在CMA基础上改进而得到的,有学者称其为实虚部分开的常模算法。该算法使均衡器输出信号的实部与虚部分别收敛于各自的模值,改…

程序猿必备工具『CSDN浏览器助手』之超实用小工具测评

CSDN浏览器助手简介 CSDN浏览器助手由CSDN官方开发&#xff0c;集成【一键呼出搜索】、【万能快捷工具】、【个性标签页】和【 “真”免广告】四大功能&#xff0c;打开后给人的第一印象就是 清新脱俗 四个字&#xff0c;功能非常丰富&#xff0c;快捷键的使用能够大大提高工作…

【自适应盲均衡4】基于RLS的多径衰落信道均衡算法(RLS-CMA)的理论推导与MATLAB仿真

关注公号【逆向通信猿】更精彩!!! 一、回顾CMA和MMA 对于前面两种算法 【自适应均衡】多径衰落信道的复数常模算法(CMA)的理论推导与MATLAB仿真 【自适应均衡】多模算法(MMA)——复数改进常模算法(MCMA)的理论推导与MATLAB仿真 误差信号为:

apache camel_使用Java的Apache Camel入门

apache camelApache Camel是一个非常有用的库&#xff0c;可以帮助您处理来自许多不同来源的事件或消息。 您可以通过许多不同的协议&#xff08;例如在VM&#xff0c;HTTP&#xff0c;FTP&#xff0c;JMS甚至DIRECTORY / FILE之间&#xff09;移动这些消息&#xff0c;但仍然使…

【自适应(盲)均衡6】信号过多径衰落信道的矩阵乘法表示之Toeplitz矩阵和Toeplitz块矩阵的生成(分数间隔FSE)

关注公号【逆向通信猿】更精彩!!! 信号过系统(多径信道)的连续形式 信号过系统(多径信道)的离散采样形式 通常接收端处理的是数字信号,需对接收信号进行采样,当采样率为符号速率时,即为符号间隔采样;采样率为符号速率的P倍时,为分数间隔采样 至于为什么要用分数…

JDK 9/10/11:Java字符串上+ =带来的副作用

问题“ 为什么array [i &#xff05;n] i ”在Java 8和Java 10中给出不同的结果&#xff1f; ”已于本周初发布在StackOverflow.com上 。 它指向JDK9和更高版本中存在的Java编译器中的错误 &#xff0c;但JDK8中不存在。 如StackOverflow线程上所述&#xff0c; Didier L提供…

Matlab库中过采样函数rcosflt参数及源代码详解(翻译)

函数定义 rcosflt函数作为MATLAB即将被替换的函数,在MATLAB R2018b中还可以使用,但是已经查不到帮助文档;虽说是要即将被替换,但是函数内部的原理其实都是一样的,这个函数搞懂了,不管被替换成什么,只要看看新函数的说明文档就知道怎么使用了,说白了就是“万变不离其宗…

【自适应盲均衡7】分数间隔的复数常模算法(FSE-CMA)

关注公号【逆向通信猿】更精彩!!! 理论推导 基于分数间隔的复数常模算法(FSE-CMA)的推导其实与符号间隔的算法是类似的,见 【自适应盲均衡2】多径衰落信道的复数常模算法(CMA)的理论推导与MATLAB仿真 分数间隔均衡器模型 分数间隔均衡器通常有两种比较经典的模型,…

Java机器学习,第2部分

欢迎使用本教程的第二部分&#xff0c;该教程使用LightningScorer评分PMML文件。 让我们找出其他参数是如何工作的。 初始步骤与教程的第一部分相似。 首先获取本地副本 git clone https://github.com/sezinkarli/lightningscorer.git并用Maven构建 mvn clean install并通…

【自适应盲均衡8】基于分数间隔的复数改进常模算法(FSE-MMA)的瑞利衰落信道盲均衡MATLAB仿真

关注公号【逆向通信猿】更精彩!!! 知识回顾 关于最基本的盲均衡算法,即CMA盲均衡的原理、推导与MATLAB仿真,可以参考 【自适应盲均衡2】多径衰落信道的复数常模算法(CMA)的理论推导与MATLAB仿真 关于改进的CMA算法,即MMA的原理、推导与MATLAB仿真,可以参考 【自适应盲…

JavaFX技巧30:带有DropShadow的ScrollPane

最近&#xff0c;在我的一个项目中&#xff0c;我发现用户很难看到ScrollPane实例的内容当前是否已滚动。 一种更清晰的方法是在滚动窗格的顶部添加阴影。 这也是Google的Material Design建议的。 所以我尝试了一下。 在我的解决方案中&#xff0c;我只是向ScrollPane添加了一…

【有限域除法】二元多项式除法电路原理及MATLAB详解

关注公号【逆向通信猿】试读更多内容!!! 二元多项式除法电路原理 例: g ( x ) = x 4 + x 2 + x + 1 g(x)=x^4 + x^2+x+1

Spring Apache Kafka教程

在本SpringApache Kafka课程中&#xff0c;我们将学习如何在Spring Boot项目中开始使用Apache Kafka&#xff0c;并开始生成和使用我们所选主题的消息。 除了一个简单的项目外&#xff0c;我们还将深入探讨Kafka的术语以及分区概念在Kafka中的工作方式。 让我们开始吧。 1.简介…