测试容器中的 Mongo

Posted

技术标签:

【中文标题】测试容器中的 Mongo【英文标题】:Mongo in testcontainers 【发布时间】:2020-10-16 16:55:34 【问题描述】: 我开始玩测试容器,在我的旅程开始时我遇到了一些问题(如下)。我为 mysql db 做了类似的事情,效果很好。我是否错过了一些特定于 mongo 的配置?根据 [docs][1],没有什么可做的。 在此先感谢您提供任何提示/示例。
com.mongodb.MongoSocketOpenException: Exception opening socket
at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:70) ~[mongodb-driver-core-3.11.2.jar:na]
at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:128) ~[mongodb-driver-core-3.11.2.jar:na]
at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:117) ~[mongodb-driver-core-3.11.2.jar:na]
at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]

我的代码: gradle.build

 testImplementation "org.testcontainers:spock:1.14.3"
 testImplementation "org.testcontainers:mongodb:1.14.3"

application.properties

spring.data.mongodb.uri=mongodb://127.0.0.1:27017/test

测试

@Testcontainers
class TestContainersExample extends IntegrationSpec 
    @Shared
    MongoDBContainer mongoDb = new MongoDBContainer()

    def "setup"() 
        mongoDb.start()

        mongoDb.waitingFor(Wait.forListeningPort()
                .withStartupTimeout(Duration.ofSeconds(180L)));
    


//test case

  

【问题讨论】:

【参考方案1】:

Testcontainers 会将 MongoDB 服务器端口映射到您机器上的随机端口。这就是为什么你不能在你的属性文件中硬编码spring.data.mongodb.uri=mongodb://127.0.0.1:27017/test

使用 JUnit 5 和 Spring Boot >= 2.2.6 的基本设置如下所示

@Testcontainers
public class MongoDbIT 

  @Container
  public static MongoDBContainer mongoDBContainer = new MongoDBContainer();

  @DynamicPropertySource
  static void mongoDbProperties(DynamicPropertyRegistry registry) 
    registry.add("spring.data.mongodb.uri", mongoDBContainer::getReplicaSetUrl);
  



如果您使用不同的 JUnit 或 Spring Boot 版本,请查看以下correct Testcontainers setup 指南。

【讨论】:

是的,你是对的。我忘记了端口绑定。谢谢! @rieckpil 但我不能只找到getReplicaSetUrl()。我正在使用 tescontainers:1.15.0 我刚刚将我的一个项目更新为 Testcontainers 1.15.1,对我来说该方法仍然可用。您的项目是包含 MongoDB 模块 (org.testcontainers:mongodb:1.15.1) 还是仅包含 Testcontainers? @rieckpil - 感谢您的回答。我刚刚访问了您的博客以及相同的一些 YT 视频。感谢所有这一切。 谢谢,这正是我想要的 :)

以上是关于测试容器中的 Mongo的主要内容,如果未能解决你的问题,请参考以下文章

在所有之前初始化测试容器中的容器

Drill 学习笔记之 与Mongo性能测试比较

您如何测试反应式 mongo 存储库?

如何在 Mongo(ose)/Express 应用程序中测试 Promise?

在 NestJS Jest 测试中覆盖提供程序

python 使用Python进行Mongo Perf测试