Testcontainer 不适用于 Kotlin 和 Quarkus - 连接到服务器 mongo 时监视器线程中的异常:27017

问题描述

我正在尝试使用 QuarkusKotlinMongoDBTestContainers 创建一个简单的待办事项应用程序。我正在使用 testcontainers 来测试我与 mongodb 的集成。不幸的是,我的测试没有像我预期的那样工作。这是我的测试用例,我不确定出了什么问题。我可以从日志中看到 mongodb 的测试容器已启动,我正在将 replicasetUrl 设置到属性中。

@QuarkusTest
class TodoResourceIT {

    @Container
    private val mongoDbContainer: MongoDBContainer = MongoDBContainer("mongo:4.2").withExposedPorts(27017)

    init {
        mongoDbContainer.start()
        System.setProperty("quarkus.mongodb.connection-string",mongoDbContainer.replicasetUrl)
    }
    @Test
    fun shouldReturn200OK() {
        given().header(HttpHeaders.CONTENT_TYPE,MediaType.APPLICATION_JSON)
            .body(Todo("1","Find","Find the letter F"))
            .`when`().post("/api/todos").then().statusCode(200)
    }
}

这是我的完整源代码https://github.com/faskan/todo-kotlin-quarkus

我看到了一个类似的话题 Integration testing with Testcontainers + Quarkus + MongoDB。但该解决方案仅适用于 Java。这是我使用 Java 的示例实现,它工作得非常好。 https://github.com/faskan/todo-java-quarkus

我现在面临的问题是 Kotlin。

堆栈跟踪:

INFO  [org.mon.dri.cluster] (cluster-ClusterId{value='60d34ff2ffb00164d8f60cbc',description='null'}-mongo:27017) Exception in monitor thread while connecting to server mongo:27017: com.mongodb.MongoSocketException: mongo
    at com.mongodb.ServerAddress.getSocketAddresses(ServerAddress.java:211)
    at com.mongodb.internal.connection.socketStream.initializeSocket(SocketStream.java:75)
    at com.mongodb.internal.connection.socketStream.open(SocketStream.java:65)
    at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:143)
    at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.lookupServerDescription(DefaultServerMonitor.java:188)
    at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:144)
    at java.base/java.lang.Thread.run(Thread.java:831)
Caused by: java.net.UnkNownHostException: mongo
    at java.base/java.net.InetAddress$CachedAddresses.get(InetAddress.java:800)
    at java.base/java.net.InetAddress$NameServiceAddresses.get(InetAddress.java:886)
    at java.base/java.net.InetAddress.getAllByName0(InetAddress.java:1507)
    at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1366)
    at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1300)
    at com.mongodb.ServerAddress.getSocketAddresses(ServerAddress.java:203)

解决方法

你的 quarkus 版本是哪个?

您可以 QuarkusTestResourceLifecycleManager 存档,我已经使用 kotlin 对其进行了测试并且工作正常。 Here 有一个示例说明如何执行此操作