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

Posted

技术标签:

【中文标题】Testcontainer 不适用于 Kotlin 和 Quarkus - 连接到服务器 mongo:27017 时监视器线程中出现异常【英文标题】:Testcontainer doesn’t work with Kotlin and Quarkus - Exception in monitor thread while connecting to server mongo:27017 【发布时间】:2021-09-07 04:34:34 【问题描述】:

我正在尝试使用 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-ClusterIdvalue='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)

【问题讨论】:

这看起来像是 DNS 问题。 【参考方案1】:

你的 quarkus 版本是什么?

你可以QuarkusTestResourceLifecycleManager 来存档,我已经用 kotlin 测试过它并且工作正常。 Here 有一个例子说明如何做到这一点

【讨论】:

感谢您的回复。我使用的是低于 2.0 的版本。我可以将我的版本升级到 2.0.0,但我找不到 mongodb devservice 的文档。我在看github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc。能否请您提供 mongodb devservice 文档的链接? 是的@FaisalKhan 没有很多文档,devServices 仅用于开发模式,我必须更新响应,但我会在我的 repo 中为您提供一个与 kotlin 进行集成测试的示例和 mongo 可以在任何 quarkus 版本中工作 @FaisalKhan 检查这个 repo github.com/javiertoja/***/tree/main/…,重要的部分是类 MockMongoDatabase,它实现了 QuarkusTestResourceLifecycleManager 接口。 感谢您的解决方案。它完美地工作!但是我对为什么 Java 和 Kotlin 实现之间的行为不同感到有些困惑。我期待 kotlin 'init' 块像 Java 'static' 块一样工作。是不是我的理解有问题。

以上是关于Testcontainer 不适用于 Kotlin 和 Quarkus - 连接到服务器 mongo:27017 时监视器线程中出现异常的主要内容,如果未能解决你的问题,请参考以下文章

InjectMocks 不适用于具有默认值的 Kotlin 构造函数参数

Dagger2 Qualifier 不适用于 Kotlin?

android kotlin multiplatform kotlinx.serialization 适用于调试但不适用于发布版本

Kotlin:尝试在 WebView 上添加 onReceivedError 时出现“修改器‘覆盖’不适用于‘本地函数’”错误

具有不可变属性的@ConstructorBinding 不适用于 Spring Boot Kotlin 中的 @Value @ConfigurationProperties

@RequestBody 不适用于 @JsonProperty