为 mongodb 的 micronaut 设置测试容器

Posted

技术标签:

【中文标题】为 mongodb 的 micronaut 设置测试容器【英文标题】:Setup testcontainers for micronaut for mongodb 【发布时间】:2021-02-18 08:32:42 【问题描述】:

我正在使用 Testcontainers、Micronaut 和 Kotlin,但不知何故,Micronaut 不希望替换我正在启动的 MongoDB 的动态端口,并且它目前正在工作。

我没有替换 (/src/test/resources) 下的application-test.yml

micronaut:
  application:
    name: abc
mongodb:
  connection-pool:
    max-size: 20
  uri: mongodb://$MONGO_HOST:localhost:$MONGO_PORT

这是我的设置代码:

// class .....
companion object 
        private lateinit var embeddedServer: EmbeddedServer
        lateinit var mongoContainer: MongoContainer

        @BeforeAll
        @JvmStatic
        internal fun beforeAll() 
            mongoContainer = MongoContainer()
            mongoContainer.start()
            assertThatPortIsAvailable(mongoContainer)

            System.setProperty("MONGO_HOST", mongoContainer.containerIpAddress)
            System.setProperty("MONGO_PORT", mongoContainer.getPort().toString())

            println(System.getProperties()) // THE ENV VAR IS AVAILABLE HERE
            println("aaaaaaaa" + mongoContainer.getPort())

            embeddedServer = ApplicationContext.run(EmbeddedServer::class.java, PropertySource.of(
                    "test", mapOf(
                    "mongo.uri" to mongoContainer.containerIpAddress,
                    "mongo.port" to mongoContainer.getPort())
            ))
        

错误消息:消息:无法解析占位符 $MONGO_PORT

【问题讨论】:

【参考方案1】:

这帮助我在 Kotlin 中运行带有 micronauts 的 Testcontainers。

import a.b.c.model.NewOffer
import a.b.c.model.QuantityType
import io.micronaut.test.extensions.junit5.annotation.MicronautTest
import io.micronaut.test.support.TestPropertyProvider
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.TestInstance
import org.testcontainers.containers.MongoDBContainer
import org.testcontainers.junit.jupiter.Testcontainers
import javax.inject.Inject

@Testcontainers
@MicronautTest()
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
internal class OfferRepositoryTest() : TestPropertyProvider 

    @Inject
    private lateinit var offerRepository: OfferRepository

    private val mongoDBContainer: MongoDBContainer = MongoDBContainer("mongo:4").apply  start() 

    @Test
    internal fun getEmptyOffers() 
        val find = offerRepository.find()
        assertThat(find).isEmpty()
    

    override fun getProperties(): MutableMap<String, String> 
        return mutableMapOf(
                "MONGO_HOST" to mongoDBContainer.containerIpAddress,
                "MONGO_PORT" to "$mongoDBContainer.getMappedPort(27017)"
        )
    

并且 src/main/resources/application.yml 看起来是由 micronaut 生成的

mongodb:
  connection-pool:
    max-size: 20
  uri: mongodb://$MONGO_HOST:localhost:$MONGO_PORT:27017

【讨论】:

【参考方案2】:

最好通过实现TestPropertyProvider 来提供完整的mongodb.uri

我认为您想使用mongoContainer.getMappedPort(27017) 获取实际端口。

【讨论】:

谢谢,TestPropertyProvider 接口帮助解决了这个问题micronaut-projects.github.io/micronaut-test/latest/guide 我已经添加了我的解决方案作为答案

以上是关于为 mongodb 的 micronaut 设置测试容器的主要内容,如果未能解决你的问题,请参考以下文章

使用 Junit 5 和 Micronaut 设置测试 MongoDBContainer

使用 java 在 Micronaut 中将 MongoDb ObjectId _id 更改为字符串

如何设置 Micronaut 上下文路径

Micronaut cli graphql 设置

在 Micronaut 应用程序中使用 TestContainer 的测试环境的 ApplicationContext 不起作用

在 micronaut 中为集成测试配置数据库