我正在尝试执行以下操作;
但是使用org.testcontainers.containers.MySQLR2DBCDatabaseContainer
任何人都可以告诉我如何实现这一点,因为 MySQLR2DBCDatabaseContainer 似乎没有以下方法:
@Testcontainers
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class ApplicationIT {
@Container
public static PostgreSQLContainer postgreSQLContainer = new PostgreSQLContainer()
.withPassword("inmemory")
.withUsername("inmemory");
@DynamicPropertySource
static void postgresqlProperties(DynamicPropertyRegistry registry) {
registry.add("spring.datasource.url", postgreSQLContainer::getJdbcUrl);
registry.add("spring.datasource.password", postgreSQLContainer::getPassword);
registry.add("spring.datasource.username", postgreSQLContainer::getUsername);
}
@Test
public void contextLoads() {
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Testcontainers 和 junit5 在 SpringBoot 中为 Spring Data Elastisearch 存储库编写集成测试。但测试失败了
org.springframework.beans.factory.UnsatisfiedDependencyException:创建名称为“com.example.demo.AddressRepositoryTest”的bean时出错:通过字段“repository”表达的依赖关系不满足;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有“com.example.demo.AddressRepository”类型的合格 bean 可用:预计至少有 1 个有资格作为自动装配候选者的 bean。依赖注释:{@org.springframework.beans.factory.annotation.Autowired(required=true)}
我该如何解决这个问题?我尝试谷歌搜索但找不到任何合适的东西。
数据传输组织
@Data
@Document(indexName = "addresses")
public class Address {
String city;
String street;
GeoJsonPoint location;
}
Run Code Online (Sandbox Code Playgroud)
存储库
@Repository
public interface AddressRepository extends ElasticsearchRepository<Address, String> {
}
Run Code Online (Sandbox Code Playgroud)
测试AddressRepositoryTest.java
@ExtendWith(SpringExtension.class)
@Testcontainers
class AddressRepositoryTest {
private static final String ELASTICSEARCH_VERSION = "7.10.1";
static class Initializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(final ConfigurableApplicationContext configurableApplicationContext) {
}
}
@Container
public static ElasticsearchContainer container = new …Run Code Online (Sandbox Code Playgroud) 当我尝试模拟一些容器数据库并查看可用的内容时,我有点困惑,很多都引用了这两个库,例如以下示例:
https://github.com/mydeveloperplanet/myliquibaseplanet/blob/feature/testcontainers/pom.xml
然而,我在本地管理它们和将它们集成到我的位桶管道之间遇到了许多问题。
是否有一些关于旋转数据库容器以及这两个库的哪些版本彼此兼容的可靠文档。
我在我的oss软件中使用testcontainer,但我认为我的配置或docker/testcontainer运行时有问题......
我有一些测试,当它们分开运行时,一切正常,但是当我尝试运行所有测试时,最后一个测试由于应用程序尝试与容器连接时出现问题而失败。
调试问题我发现容器在一个端口启动,但应用程序正在尝试在其他端口连接,其中大部分在最后运行的测试类中使用
所有测试正在运行:
失败的测试之一向我显示了以下日志:
当类启动时容器启动UserControllerTest使用另一个端口,如下所示:
我的测试配置基于一个抽象类(见下文),就像所说的那样,如果运行仅显示错误的类,则一切正常。
@Testcontainers
@ActiveProfiles("test")
@ExtendWith(SpringExtension::class)
@TestMethodOrder(value = OrderAnnotation::class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
abstract class AbstractTest {
companion object {
@Container
private val redisContainer = GenericContainer<Nothing>("redis:6-alpine")
.apply {
withExposedPorts(6379)
withCreateContainerCmdModifier { cmd -> cmd.withName("wb-test-cache") }
}
@Container
private val postgresContainer = PostgreSQLContainer<Nothing>("postgres:13-alpine")
.apply {
withExposedPorts(5432)
withUsername("sa_webbudget")
withPassword("sa_webbudget")
withDatabaseName("webbudget")
withCreateContainerCmdModifier { cmd -> cmd.withName("wb-test-database") }
}
@JvmStatic
@DynamicPropertySource
fun dynamicPropertiesRegister(registry: DynamicPropertyRegistry) {
registry.add("spring.datasource.url", postgresContainer::getJdbcUrl)
registry.add("spring.redis.host", redisContainer::getHost)
registry.add("spring.redis.port", redisContainer::getFirstMappedPort)
}
} …Run Code Online (Sandbox Code Playgroud) kotlin docker spring-boot testcontainers testcontainers-junit5
我正在使用FTPClient针对 FTP 服务器使用Testcontainers.
可重现的代码示例如下:
import org.apache.commons.net.PrintCommandListener;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.images.builder.ImageFromDockerfile;
import org.testcontainers.junit.jupiter.Testcontainers;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import static org.assertj.core.api.Assertions.assertThat;
@Testcontainers
class FtpUtilsTest {
private static final int PORT = 21;
private static final String USER = "user";
private static final String PASSWORD = "password";
private static final int FTP_TIMEOUT_IN_MILLISECONDS = 1000 * 60;
private static final GenericContainer ftp = new …Run Code Online (Sandbox Code Playgroud) 我在 Spring Boot 项目中使用 Testcontainers 和 mariaDB 数据库进行单元测试。我最近将Spring Boot从2.4.4升级到2.6.6,发现单元测试开始失败。在发生 Flyway 迁移(创建数据库模式)后,再次创建了 Testcontainers(?)。
\n我有点困惑,想知道是否需要设置特定配置才能使单元测试再次工作。
\n依赖关系如下
\nplugins {\n ...\n id 'org.springframework.boot' version '2.6.6'\n id "org.flywaydb.flyway" version "8.4.2"\n ...\n}\n\ndependencies {\n ...\n testCompileOnly 'junit:junit:4.13.2'\n testRuntimeOnly 'org.junit.vintage:junit-vintage-engine:5.8.2'\n implementation "org.flywaydb:flyway-core:8.1.0"\n implementation 'org.mariadb.jdbc:mariadb-java-client:3.0.4'\n implementation "org.jooq:jooq:3.16.5"\n testImplementation "org.testcontainers:mariadb:1.16.2"\n ....\nRun Code Online (Sandbox Code Playgroud)\n配置如下
\nspring.datasource.url=jdbc:tc:mariadb:10.5:///\nspring.datasource.driver-class-name=org.testcontainers.jdbc.ContainerDatabaseDriver\nspring.datasource.username=""\nspring.datasource.password=""\n\nspring.jooq.sql-dialect=MARIADB\n\nspring.flyway.enabled=true\nspring.flyway.locations=filesystem:./src/main/resources/db/migration\nspring.flyway.url=jdbc:tc:mariadb:10.5:///\nspring.flyway.baseline-on-migrate=true\n\n# logging\nlogging.level.org.hibernate.SQL=DEBUG\nlogging.level.org.hibernate.type=TRACE\nRun Code Online (Sandbox Code Playgroud)\n日志消息如下
\nINFO 49309 --- [ Test worker] c.a.a.m.r.MyUnitTest : Starting MyUnitTest using Java 11.0.11 on xxxxxxx with PID 49309 (started by user.name in /Volumes/code/sample/sample)\nINFO 49309 --- [ Test worker] …Run Code Online (Sandbox Code Playgroud) 我正在尝试在本地运行集成测试。我正在尝试拉取 mongo 3.6.0 映像,但出现以下错误。同样的事情也适用于非 m1 mac。
错误 org.testcontainers.dockerclient.DockerClientProviderStrategy.lambda$getFirstValidStrategy$7 - UnixSocketClientProviderStrategy:失败,出现异常 RuntimeException (java.lang.UnsatisfiedLinkError: /private/var/folders/88/zxy8rm992j10d7_db5w5w2580000gq/T/jna--714400992/jna37482 87117789473831.tmp: dlopen (/private/var/folders/88/zxy8rm992j10d7_db5w5w2580000gq/T/jna--714400992/jna3748287117789473831.tmp,0x0001):尝试:'/private/var/folders/88/zxy8rm992j10d7_db5w5 w2580000gq/T/jna--714400992/jna3748287117789473831.tmp '(胖文件,但缺少兼容架构(有'i386,x86_64',需要'arm64e')),'/usr/lib/jna3748287117789473831.tmp'(没有这样的文件))。根本原因UnsatisfiedLinkError (/private/var/folders/88/zxy8rm992j10d7_db5w5w2580000gq/T/jna--714400992/jna3748287117789473831.tmp: dlopen(/private/var/folders/88/zxy8rm992j10d7_db 5w5w2580000gq/T/jna--714400992/jna3748287117789473831.tmp, 0x0001):尝试:'/private/var/folders/88/zxy8rm992j10d7_db5w5w2580000gq/T/jna--714400992/jna3748287117789473831.tmp'(胖文件,但缺少兼容的体系结构(有'i386,x86_64',需要'arm6) 4e')) ,'/usr/lib/jna3748287117789473831.tmp'(没有这样的文件))
无法获取 Docker 映像:RemoteDockerImage(imageName=mongo:3.6.0, imagePullPolicy=DefaultPullPolicy()) at org.testcontainers.containers.GenericContainer.getDockerImageName(GenericContainer.java:1278) at org.testcontainers.containers.GenericContainer.logger (GenericContainer.java:612) at org.testcontainers.containers.GenericContainer.doStart(GenericContainer.java:317) ... 74 更多 原因:java.lang.IllegalStateException:之前查找 Docker 环境的尝试失败。不会重试。请查看日志并检查配置 org.testcontainers.dockerclient.DockerClientProviderStrategy.getFirstValidStrategy(DockerClientProviderStrategy.java:108) org.testcontainers.DockerClientFactory.getOrInitializeStrategy(DockerClientFactory.java:134) org.testcontainers.DockerClientFactory.client(DockerClientFactory.java) :176)在org.testcontainers.LazyDockerClient.getDockerClient(LazyDockerClient.java:14)在org.testcontainers.LazyDockerClient.inspectImageCmd(LazyDockerClient.java:12)在org.testcontainers.images.LocalImagesCache.refreshCache(LocalImagesCache.java:42)在 org.testcontainers.images.AbstractImagePullPolicy.shouldPull(AbstractImagePullPolicy.java:24) 在 org.testcontainers.images.RemoteDockerImage.resolve(RemoteDockerImage.java:66) 在 org.testcontainers.images.RemoteDockerImage.resolve(RemoteDockerImage.java:27) )在 org.testcontainers.utility.LazyFuture.getResolvedValue(LazyFuture.java:17) 在 org.testcontainers.utility.LazyFuture.get(LazyFuture.java:39) 在 org.testcontainers.containers.GenericContainer.getDockerImageName(GenericContainer.java:第1276章)
我在我的 docker 文件中遵循非 root 用户配置
#非root用户配置 RUN addgroup -S -g 10001 appGrp
&& adduser -S -D -u 10000 -s /sbin/nologin -h /opt/app/ -G appGrp …
我使用Testcontainers.MsSql 3.0.0在 asp.net 项目中进行集成测试。集成测试在 Visual Studio 测试运行器中成功运行。但是当我通过 docker build 命令在docker 桌面版本 20.10.7中运行测试时,出现错误:
\n\n\n自动发现未检测到 Docker 主机配置无法\n检测 Docker 终结点。使用环境变量或 ~/.testcontainers.properties 文件来自定义配置\n
\n
这是container\xe2\x80\x99s创建代码:
\nVar dbContainer\n = new MsSqlBuilder()\n .WithImage(imageName)\n .WithCleanUp(true)\n .Build();\nRun Code Online (Sandbox Code Playgroud)\n这是我的 docker 文件:
\nFROM mcr.microsoft.com/dotnet/sdk:7.0 AS build-env\n\nARG buildVersion\n\nWORKDIR /app\nCOPY . ./\n\nRUN dotnet restore ./Test.sln\n\nRUN dotnet test ./Test.sln /p:CollectCoverage=true \n\nRUN dotnet publish ./Test/ -c Release -o out\n\nFROM mcr.microsoft.com/dotnet/aspnet:7.0\n\nWORKDIR /app\nCOPY --from=build-env /app/out .\n\nENV TZ=Asia/Tehran\nRUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone\nRUN …Run Code Online (Sandbox Code Playgroud) 假设我想将 Spring Boot 2.x 应用程序中依赖于 JPA 数据源的代码与 PostgreSQL testcontainer(使用一行或多行代码从测试类中管理 Docker 容器的好工具)集成测试代码。进一步假设我正在管理 中的端口(包含在 JDBC URL 中)application.properties,例如
spring.datasource.url=jdbc:postgresql://user-service-postgres:5432/user_service
Run Code Online (Sandbox Code Playgroud)
在集成测试中,我创建测试容器
@Rule
PostgreSQLContainer postgreSQLContainer = new PostgreSQLContainer();
Run Code Online (Sandbox Code Playgroud)
在准备方法中,我可以访问我想要设置的spring.datasource.url值
postgreSQLContainer.getJdbcUrl()
Run Code Online (Sandbox Code Playgroud)
如何告诉测试中的 Spring Boot 使用该 URL 而不是application.properties.
我想坚持使用我的属性文件,以尽量减少更改,但我很感谢其他方法,包括解释为什么它们是优越的或必要的。
我正在使用 Spring Boot 2.x。
我尝试将测试容器与 Oracle-XE 模块和 Spring Boot 一起使用,到目前为止,当我启动我的测试时,我遇到了异常:
Caused by: java.lang.IllegalArgumentException: JDBC URL matches jdbc:tc: prefix but the database or tag name could not be identified
Run Code Online (Sandbox Code Playgroud)
在我的 中src/test/application.properties,我将 url 数据源声明为:
spring.datasource.url=jdbc:tc:oracle-xe://somehostname:someport/databasename?TC_INITSCRIPT=schema-test.sql
Run Code Online (Sandbox Code Playgroud)
为了表明泊坞窗图像拉为Oracle-XE,我创建的文件testcontainers.properties中src/test/resources:
oracle.container.image=oracleinanutshell/oracle-xe-11g:1.0.0
Run Code Online (Sandbox Code Playgroud)
你有什么想法如何使这项工作?
它与 MySQL 完美配合,数据源 url :
spring.datasource.url=jdbc:tc:mysql:5.6.23://somehostname:someport/databasename?TC_INITSCRIPT=schema-test.sql
Run Code Online (Sandbox Code Playgroud) testcontainers ×10
java ×4
spring-boot ×4
docker ×2
spring ×2
apple-m1 ×1
arm64 ×1
asp.net-core ×1
containers ×1
flyway ×1
ftp ×1
ftp-client ×1
junit4 ×1
junit5 ×1
kotlin ×1
mariadb ×1
mysql ×1
oracle-xe ×1
r2dbc ×1
spring-data ×1