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 【问题描述】:我正在尝试使用 Quarkus、Kotlin、MongoDB 和 TestContainers 创建一个简单的待办事项应用程序。我正在使用 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