imalik8088
imalik8088

Reputation: 1631

Setup testcontainers for micronaut for mongodb

I'm playing around with Testcontainers, Micronaut and Kotlin and somehow Micronaut doesn't want replace to the dynamic port of the MongoDB that I'm starting and its working so far.

I haven't replaced the application-test.yml under (/src/test/resources)

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

Here is my setup code:

// 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())
            ))
        }

Error message: Message: Could not resolve placeholder ${MONGO_PORT}

Upvotes: 1

Views: 2268

Answers (2)

imalik8088
imalik8088

Reputation: 1631

Thats helped me in in order to run Testcontainers with micronauts in Kotlin.

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)}"
        )
    }
}

and the src/main/resources/application.yml looks as generated by micronaut

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

Upvotes: 3

Sascha Frinken
Sascha Frinken

Reputation: 3356

You are better off providing the complete mongodb.uri by implementing TestPropertyProvider.

And I think you want to get the actual port with mongoContainer.getMappedPort(27017).

Upvotes: 1

Related Questions