【问题标题】:Setup testcontainers for micronaut for mongodb为 mongodb 的 micronaut 设置测试容器
【发布时间】: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}

【问题讨论】:

    标签: kotlin micronaut testcontainers


    【解决方案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) 获取实际端口。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-14
      • 2021-04-14
      • 1970-01-01
      • 2021-10-18
      • 2013-06-24
      • 2020-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多