通过运行docker数据库映像进行集成测试



我有一个测试数据库作为Docker映像提供,我想编写集成测试,只击中该测试数据库。我不知道如何设置这个,我想让这个在Jenkins机器上运行(docker映像应该自动启动)。我已经尝试了TestContainers,织物。io,但我无法成功连接到容器。有人能帮帮我吗?


public class MyContainer extends OracleContainer {
private static       MyContainer container;

public MyContainer (DockerImageName myImage) {
super(myImage);
}
public static MyContainer getInstance() {
if (container == null) {
DockerImageName myImage = DockerImageName.parse("docker-image-name")
.asCompatibleSubstituteFor("gvenzl/oracle-xe");
container = new MyContainer (myImage);
}
return container;
}
@Override
public void start() {
super.start();
System.setProperty("DB_URL", container.getJdbcUrl());
System.setProperty("DB_USERNAME", container.getUsername());
System.setProperty("DB_PASSWORD", container.getPassword());
}
@Override
public void stop() {
//do nothing, JVM handles shut down
}
}

application.properties

spring.datasource.url=${DB_URL}
spring.datasource.username=${DB_USERNAME}
spring.datasource.password=${DB_PASSWORD}

测试
@SpringBootTest
public class DockerConnectionIT {
@ClassRule
public static OracleContainer oracleContainer = BaeldungPostgresqlContainer.getInstance();
@Autowired
private UserRepository userRepository;
@Test
void doSomething() {
System.out.println("");
}
}

不幸的是测试没有开始,我得到异常:

Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]: Unsatisfied dependency expressed through method 'dataSourceScriptDatabaseInitializer' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalArgumentException: URL must start with 'jdbc'
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800)
at

如果你已经有docker镜像,那么考虑使用TestContainers项目

它提供了你所需要的:提供与docker服务器交互的Java API。

你可以把它作为一个规则集成到各种测试框架(TestNG、JUnit等等)中。下面是JUnit 5的示例。

如果您使用Spring Boot进行集成测试,那么提供额外的集成可能是有意义的,以便由Spring加载的数据源(例如,JPA测试)将使用到该数据库的连接。

这个机制非常适合各种数据库的测试,不一定是关系型数据库,像mongo, redis等也可以在这个项目中工作得很好,只要你有一个docker镜像来运行

最新更新