groovy 如何防止在spock micronaut测试中使用生产MongoDB URI

9fkzdhlc  于 2023-01-20  发布在  Go
关注(0)|答案(1)|浏览(112)

如何确保我的测试永远不会在Micronaut应用程序中使用生产MongoDB URI?
我目前在我的测试配置中使用嵌入式服务器来运行带有测试MongoDB容器的测试,如下所示:

@MicronautTest
class JwtAuthenticationSpec extends Specification {

final MongoDBContainer mongoDBContainer = new MongoDBContainer(DockerImageName.parse("mongo:6.0.3"))
        .withExposedPorts(27017)

def setup() {
    mongoDBContainer.start()
    embeddedServer = ApplicationContext.run(EmbeddedServer,
            ['mongodb.uri': "${mongoDBContainer.connectionString}/fire"]) //sets the uri to the test containers one
}
//...

我在application.yml中的MongoDB配置如下所示:

mongodb:
  uri: ${MONGO_PROD_URI}

我担心未来的开发人员会创建一个新的测试,使用一个没有嵌入式服务器的新客户端,这将意味着测试将使用生产url对吗?我如何避免这种情况,以确保测试将永远不会使用生产url?

qxsslcnc

qxsslcnc1#

查看MongoDB的Micronaut测试资源。
请参阅使用Micronaut数据访问MongoDB数据库指南MongoDB演示如何使用MongoDB和Micronaut测试资源以及如何在生产环境中运行:
当应用程序在本地启动时--无论是在测试中还是通过运行应用程序--都会检测到属性mongodb.uri的解析,并且Test Resources服务将启动一个本地MongoDB docker容器,并注入将其用作数据源所需的属性。
在生产环境下运行时,应该通过环境变量将此属性替换为生产MongoDB示例的位置。
MONGODB_URI=mongodb://username:password@production-server:27017/databaseName

更多信息

测试资源文档中关于MongoDB的部分比较少,在介绍部分:
测试资源仅在开发(例如,运行Gradle run任务或Maven mn:run目标时)和测试执行期间可用:产品代码将要求资源可用。
简单地说,Micronaut测试资源为您处理旋转测试容器。
测试资源不会阻止开发人员将产品URI设置为环境变量或属性文件。
你可以这样做:

  • /测试/java/com/示例/MongoContainer.java*
@Factory
@Requires(env = Environment.TEST)
@Replaces(factory = DefaultMongoClientFactory.class)
public class MongoContainer {

    @Bean(preDestroy = "close")
    @Singleton
    @Primary
    public MongoClient create(MongoClientSettings settings) {
        MongoDBContainer container = new MongoDBContainer(DockerImageName.parse("mongo:6.0.3"))
                .withExposedPorts(27017);
        container.start();

        MongoClientSettings testClientSettings = MongoClientSettings.builder(settings).applyConnectionString(
                new ConnectionString(container.getConnectionString() + "/fire")).build();

        return MongoClients.create(testClientSettings);
    }
}

这将在测试环境中忽略mongodb.uri属性,并且您的测试用例不需要启动容器。也可以在上面的工厂中为映像名称("mongo:6.0.3")添加属性。

相关问题