为mongodb的micronaut设置测试容器

问题描述

我正在与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}

解决方法

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

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

,

那对我很有帮助,以便在Kotlin中运行带有微型口的Testcontainer。

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}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...