为 mongodb 的 micronaut 设置测试容器
Setup testcontainers for micronaut for mongodb
我正在尝试使用 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}
您最好通过实施 TestPropertyProvider
来提供完整的 mongodb.uri
。
而且我认为您想使用 mongoContainer.getMappedPort(27017)
获得实际端口。
为了 运行 在 Kotlin 中使用 micronauts 测试容器,这对我很有帮助。
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}
我正在尝试使用 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}
您最好通过实施 TestPropertyProvider
来提供完整的 mongodb.uri
。
而且我认为您想使用 mongoContainer.getMappedPort(27017)
获得实际端口。
为了 运行 在 Kotlin 中使用 micronauts 测试容器,这对我很有帮助。
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}