我正在try 定义一个在所有集成测试之前执行一次的@TestConfiguration类,以便在Spring Boot项目中运行Kotlin中的MongoDB TestContainer.

以下是代码:

import org.springframework.boot.test.context.TestConfiguration
import org.springframework.test.context.DynamicPropertyRegistry
import org.springframework.test.context.DynamicPropertySource
import org.testcontainers.containers.MongoDBContainer
import org.testcontainers.utility.DockerImageName


@TestConfiguration
class TestContainerMongoConfig {

  companion object {

    @JvmStatic
    private val MONGO_CONTAINER: MongoDBContainer = MongoDBContainer(DockerImageName.parse("mongo").withTag("latest")).withReuse(true)

    @JvmStatic
    @DynamicPropertySource
    private fun emulatorProperties(registry: DynamicPropertyRegistry) {
      registry.add("spring.data.mongodb.uri", MONGO_CONTAINER::getReplicaSetUrl)
    }

    init { MONGO_CONTAINER.start() }

  }

}

问题似乎是emulatorProperties方法没有被调用. 常规流程应该是启动容器,然后设置属性. 第一步会发生,第二步不会.

我知道有一个替代方案,我可以在每个功能测试类中进行此配置,但我不喜欢它,因为它会向测试类添加不需要的噪音.

例如,对于使用Postgres的Java项目,我设法使其与以下代码一起工作:

import javax.sql.DataSource;

import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.context.annotation.Bean;
import org.testcontainers.containers.PostgreSQLContainer;
import org.testcontainers.utility.DockerImageName;


@TestConfiguration
public class PostgresqlTestContainersConfig {

  static final PostgreSQLContainer POSTGRES_CONTAINER;
  private final static DockerImageName IMAGE = DockerImageName.parse("postgres").withTag("latest");

  static {
    POSTGRES_CONTAINER = new PostgreSQLContainer(IMAGE);
    POSTGRES_CONTAINER.start();
  }


  @Bean
  DataSource dataSource() {
    return DataSourceBuilder.create()
        .username(POSTGRES_CONTAINER.getUsername())
        .password(POSTGRES_CONTAINER.getPassword())
        .driverClassName(POSTGRES_CONTAINER.getDriverClassName())
        .url(POSTGRES_CONTAINER.getJdbcUrl())
        .build();
  }
}

我正在try 实现相同的功能,但使用的是Kotlin和MongoDB.

你知道是什么原因导致@DynamicPropertySource人没被叫到吗?

推荐答案

@DynamicPropertySource是Spring-Boot上下文生命周期的一部分.由于您希望以某种方式复制Java安装程序,因此不需要使用@DynamicPropertySource.取而代之的是,你可以跟随Singleton Container Pattern,并在Kotlin 复制它.

您可以将它们设置为系统属性,而不是在注册表上设置配置,而Spring Autoconfig将获取它:

    init { 
      MONGO_CONTAINER.start() 
      System.setProperty("spring.data.mongodb.uri", MONGO_CONTAINER.getReplicaSetUrl());
    }

Mongodb相关问答推荐

MongoDB Aggregate-如何在条件中替换字符串中的变量

MongoDB.ArrayFilters出错:在路径中找不到标识符';elem';的数组筛选器

在服务器上部署后端时判断??=默认判断

使用mongo'db.Decode(&dto)映射一个嵌套的 struct

使用 multer 在我的 MERN 前端显示 MongoDB 图像的正确语法是什么?

在 Mongo 聚合中,可以通过分组生成 3 个不同的计数

程序可以运行,但我不断收到发送到客户端后无法设置标题,我应该忽略它吗?

Nestjs中不同语言数据的mongodb聚合代码

为什么mongodb的文档中存储键名

如何使用 Spring Data MongoDB 通过 GridFS ObjectId 获取二进制流

使用模拟 MongoDB 服务器进行单元测试

无法连接到mongolab主机

pymongo 排序和 find_one 问题

MongoDB聚合排序不起作用

为什么我新创建的 mongodb 本地数据库增长到 24GB?

我如何使用 Twitter 的流 api 中的推文并将它们存储在 mongodb 中

将新值推送到 mongodb 内部数组 - mongodb/php

按 id 删除记录?

'this' 在 Mongoose 预保存挂钩中未定义

查找聚合性能差