Spring Boot 测试容器支持中文文档

本文为官方文档直译版本。原文链接

Spring Boot 测试容器支持中文文档

    • 引言
    • 在开发时使用测试容器
      • 开发时贡献动态属性
      • 导入测试容器声明类
      • 在开发时将 DevTools 与 Testcontainers 结合使用

引言

除了在集成测试中使用 Testcontainers 外,在开发过程中也可以使用它们。接下来的章节将详细介绍这一点。

在开发时使用测试容器

这种方法允许开发人员为应用程序所依赖的服务快速启动容器,无需手动配置数据库服务器等。以这种方式使用 Testcontainers 所提供的功能与 Docker Compose 类似,只是容器配置使用的是 Java 而不是 YAML。
要在开发时使用 Testcontainers,您需要使用 "test "类路径而不是 "main "来启动应用程序。这将允许您访问所有已声明的测试依赖项,并为您提供一个编写测试配置的自然位置。
要创建应用程序的测试启动版本,应在 src/test 目录下创建一个 “Application” 类。例如,如果您的主应用程序在 src/main/java/com/example/MyApplication.java 中,则应创建 src/test/java/com/example/TestMyApplication.java
TestMyApplication 类可使用 SpringApplication.from(...) 方法启动真实应用程序:

import org.springframework.boot.SpringApplication;public class TestMyApplication {public static void main(String[] args) {SpringApplication.from(MyApplication::main).run(args);}}

您还需要定义要与应用程序一起启动的容器实例。为此,您需要确保已将 spring-boot-testcontainers 模块添加为测试依赖关系。添加完成后,您就可以创建一个 @TestConfiguration 类,为要启动的容器声明 @Bean 方法。
您还可以用 @ServiceConnection@Bean 方法进行注解,以创建 ConnectionDetails Bean。有关支持技术的详细信息,请参阅服务连接部分。
典型的 Testcontainers 配置如下所示:

import org.testcontainers.containers.Neo4jContainer;import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
import org.springframework.context.annotation.Bean;@TestConfiguration(proxyBeanMethods = false)
public class MyContainersConfiguration {@Bean@ServiceConnectionpublic Neo4jContainer<?> neo4jContainer() {return new Neo4jContainer<>("neo4j:5");}}

容器 Bean 的生命周期由 Spring Boot 自动管理。容器将自动启动和停止。

您可以使用 spring.testcontainers.beans.startup 属性来更改容器的启动方式。默认情况下使用顺序启动,但如果希望并行启动多个容器,也可以选择并行启动。

定义好测试配置后,就可以使用 with(...) 方法将其附加到测试启动器:

import org.springframework.boot.SpringApplication;public class TestMyApplication {public static void main(String[] args) {SpringApplication.from(MyApplication::main).with(MyContainersConfiguration.class).run(args);}
}

现在,您可以像启动普通 Java 主方法应用程序一样启动 TestMyApplication,以启动应用程序及其运行所需的容器。

您可以使用 Maven 任务 spring-boot:test-run 或 Gradle 任务 bootTestRun 从命令行执行此操作。

开发时贡献动态属性

如果您想在开发时从容器 @Bean 方法中贡献动态属性,可以通过注入 DynamicPropertyRegistry 来实现。其工作方式与您可以在测试中使用的 @DynamicPropertySource 注解类似。它允许您添加在容器启动后可用的属性。
典型的配置如下:

import org.testcontainers.containers.MongoDBContainer;import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.test.context.DynamicPropertyRegistry;@TestConfiguration(proxyBeanMethods = false)
public class MyContainersConfiguration {@Beanpublic MongoDBContainer mongoDbContainer(DynamicPropertyRegistry properties) {MongoDBContainer container = new MongoDBContainer("mongo:5.0");properties.add("spring.data.mongodb.host", container::getHost);properties.add("spring.data.mongodb.port", container::getFirstMappedPort);return container;}}

建议尽可能使用 @ServiceConnection,不过,对于尚未支持 @ServiceConnection 的技术来说,动态属性可能是一种有用的备用方法。

导入测试容器声明类

使用 Testcontainers 时的一种常见模式是将 Container 实例声明为静态字段。这些字段通常直接在测试类中定义。它们也可以在父类或测试实现的接口上声明。
例如,下面的 MyContainers 接口声明了 mongoneo4j 容器:

import org.testcontainers.containers.MongoDBContainer;
import org.testcontainers.containers.Neo4jContainer;
import org.testcontainers.junit.jupiter.Container;import org.springframework.boot.testcontainers.service.connection.ServiceConnection;public interface MyContainers {@Container@ServiceConnectionMongoDBContainer mongoContainer = new MongoDBContainer("mongo:5.0");@Container@ServiceConnectionNeo4jContainer<?> neo4jContainer = new Neo4jContainer<>("neo4j:5");}

如果您已经有了以这种方式定义的容器,或者您只是喜欢这种风格,您可以导入这些声明类,而不是将容器定义为 @Bean 方法。为此,请在测试配置类中添加 @ImportTestcontainers 注解:

import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.boot.testcontainers.context.ImportTestcontainers;@TestConfiguration(proxyBeanMethods = false)
@ImportTestcontainers(MyContainers.class)
public class MyContainersConfiguration {}

如果您不打算使用服务连接功能,而是想使用 @DynamicPropertySource,请从容器字段中删除 @ServiceConnection 注解。您还可以在声明类中添加 @DynamicPropertySource 注解方法。

在开发时将 DevTools 与 Testcontainers 结合使用

使用 devtools 时,您可以用 @RestartScope 对 bean 和 bean 方法进行注解。当 devtools 重新启动应用程序时,这些 Bean 将不会被重新创建。这对 Testcontainer Container Bean 尤其有用,因为它们会在应用程序重启时保持状态。

import org.testcontainers.containers.MongoDBContainer;import org.springframework.boot.devtools.restart.RestartScope;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
import org.springframework.context.annotation.Bean;@TestConfiguration(proxyBeanMethods = false)
public class MyContainersConfiguration {@Bean@RestartScope@ServiceConnectionpublic MongoDBContainer mongoDbContainer() {return new MongoDBContainer("mongo:5.0");}}

如果您使用 Gradle 并希望使用此功能,则需要将 spring-boot-devtools 依赖关系的配置从 "developmentOnly"更改为 “testImplementation”。如果默认作用域为 “developmentOnly”,BootTestRun 任务将无法捕获代码中的更改,因为 devtools 并未激活。

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

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

相关文章

计算机网络:数据链路层(VLAN)

今天又学到一个知识&#xff0c;加油&#xff01; 目录 一、传统局域网的局限&#xff08;促进VLAN的诞生&#xff09; 二、VLAN简介 三、VLAN的实现 总结 一、传统局域网的局限&#xff08;促进VLAN的诞生&#xff09; 缺乏流量隔离:即使把组流量局域化道一个单一交换机中…

Python Django 连接 PostgreSQL 操作实例

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是彭涛&#xff0c;今天为大家分享 Python Django 连接 PostgreSQL 操作实例&#xff0c;全文3500字&#xff0c;阅读大约10分钟 在Web开发中&#xff0c;使用Django连接到PostgreSQL数据库是一种常见的选择。…

06 Rust 枚举类

简单使用 enum Person {Good,Bad }let p1 Person::Good;为枚举成员添加属性 #[derive(Debug)] enum Person {Good(String), // 元组的方式描述属性Bad { name: String }, // 结构体方式描述属性, 可为属性命名 }fn main() {let p1 Person::Good("Jim"…

svn 安装

安装系统 ubuntu 22 安装命令&#xff1a; sudo apt-get install subversion 创建第一个工程&#xff1a; 创建版本库、项目 1、先创建svn根目录文件夹 sudo mkdir /home/svn 2、创建项目的目录文件夹 sudo mkdir /home/svn/demo_0 svnadmin create /home/svn/demo_0 配置&a…

Elasticsearch面试题

文章目录 为什么要使用 Elasticsearch&#xff1f;Elasticsearch 的 master 选举流程&#xff1f;Elasticsearch 集群脑裂问题&#xff1f;Elasticsearch 索引文档的流程&#xff1f;Elasticsearch 更新和删除文档的流程&#xff1f;GC 方面&#xff0c;在使用 Elasticsearch 时…

nodejs+vue+微信小程序+python+PHP邮件过滤系统的设计与实现-计算机毕业设计推荐

邮件过滤系统根据权限类型进行分类&#xff0c;主要可分为用户和管理员二大模块。 管理员模块主要根据管理员对整个系统的管理进行设计&#xff0c;提高了管理的效率和规范[11]。邮件过滤系统综合网络空间开发设计要求。该系统主要设计并完成了管理过程中的用户登录、个人信息修…

6.鸿蒙app_hap_DevEco如何真机调试模式_app安装在手机中

真机调试 手机》设置》关于手机》HarmonyOS版本》软件版本&#xff0c;连续单击10次启动开发者模式 然后&#xff1a;设置》系统和更新》开发人员选项》打开USB调试功能。 电脑USB连接手机&#xff0c;手机USB连接类型&#xff0c;传文件&#xff08;不要选择仅充电&#xf…

机器学习的数据管理

.机器学习的数据管理注意事项 机器学习的生命周期包括如下部分 (1).业务的理解&#xff0c;机器学习问题框架 (2).数据理解和收集 (3).模型的训练和评估 (4)模型部署 (5).模型监控 (6).业务衡量 数据管理和机器学习的生命周期的2&#xff0c;3&#xff0c;4个阶段有关。…

Spring Boot 3 整合 Hutool 验证码实战

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

vite基本知识

vite的了解与使用 基本知识 开发时&#xff0c;并不对代码打包&#xff0c;而实直接采用ESM的方式运行项目一 项目部署时&#xff0c;再对项目进行打包 核心原理 其核心原理是利用浏览器现在已经支持ES6的import&#xff0c;碰见import就会发送一个HTTP请求去加载文件 使…

开源 LLM 微调训练指南:如何打造属于自己的 LLM 模型

一、介绍 今天我们来聊一聊关于LLM的微调训练&#xff0c;LLM应该算是目前当之无愧的最有影响力的AI技术。尽管它只是一个语言模型&#xff0c;但它具备理解和生成人类语言的能力&#xff0c;非常厉害&#xff01;它可以革新各个行业&#xff0c;包括自然语言处理、机器翻译、…

【经典LeetCode算法题目专栏分类】【第4期】BFS广度优先算法:单词接龙、最小基因变化、二进制矩阵中的最短路径

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能AI、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 一般涉及到最小层数问题…

PyTorch自动梯度计算(注意点)

if params.grad is not None: params.grad.zero_() 我们实际的运算往往会涉及到若干个requires-grad为true的张量进行运算&#xff0c;在这种情况下&#xff0c;Pytorch会计算整个计算图上的损失的导数&#xff0c;并把这些结果累加到grad属性中。多次调用backward()会导致梯度…

京东体育用品销售数据分析与可视化系统

京东体育用品销售数据分析与可视化系统 前言数据爬取模块1. 数据爬取2. 数据处理3. 数据存储 数据可视化模块1. 数据查看2. 店铺商品数量排行3. 整体好评率4. 不同品牌市场占比5. 品牌差评率排名6. 品牌价格排名7. 品牌评论数量分布 创新点 前言 在体育用品行业&#xff0c;了…

pythonUnitTest框架

UnitTest框架 UnitTest参考文章&#xff1a;https://blog.csdn.net/qq_54219272/article/details/123265794 目标&#xff08;看完UnitTest框架该有的收获&#xff09; 掌握UnitTest框架的基本使用方法掌握断言&#xff08;判断实际结果和预期结果是否一致&#xff09;的使用方…

uniapp与vue的区别

Uniapp和Vue是两个相关但不完全相同的概念。 Uniapp是一个基于Vue.js的跨平台框架&#xff0c;用于开发多端应用&#xff0c;包括小程序、H5、App等。它通过使用Vue的语法和组件化开发模式&#xff0c;实现了一套代码可以在多个平台上运行的能力。Uniapp提供了一系列的API和组…

[Verilog] Verilog 数据类型

主页&#xff1a; 元存储博客 文章目录 前言1. bit 类型2. reg 类型3 wire类型4 integer类型5 real类型6 parameter类型7 enum类型8 array 类型9 向量类型10 time 类型11 string 类型 前言 在 Verilog 中&#xff0c;有几种不同的数据类型可以用于声明和操作变量。 在 Verilo…

系列十、存储引擎

一、存储引擎 1.1、概述 大家可能没有听说过存储引擎&#xff0c;但是一定听过引擎这个词&#xff0c;引擎就是发动机&#xff0c;是一个机器的核心组件。 比如&#xff0c;对于舰载机、直升机、火箭来说&#xff0c;它们都有各自的引擎&#xff0c;引擎是它们最为核心的组件。…

攻防世界--easyphp

浅学一下吧~ 发开题目是这样的 最烦的就是代码审计&#xff0c;还是看得少 多审计两篇代码就好了&#xff08;还是因为自己会的不多&#xff09; <?php highlight_file(__FILE__);//将当前文件的源代码进行高亮显示 $key1 0;//将变量$key1的值初始化为0 $key2 0;//将变量…

第一个程序(STM32F103点灯)

点亮LED 看原理图确定控制LED的引脚看主芯片手册确定如何设置/控制引脚写程序 LED有很多种&#xff0c;像插脚的&#xff0c;贴片的。 它们长得完全不一样&#xff0c;因此我们在原理图中将它抽象出来。 嵌入式系统中&#xff0c;一个LED的电阻非常低&#xff0c;I U/R&…