带有@Testcontainers的Mongo驱动程序,在测试成功运行后抛出异常

问题描述 投票:0回答:3

我正在使用 testcontainers:mongodb 在示例 spring boot kotlin 项目中设置集成测试。

我已经设置了 MongoDBContaine,一切都按预期工作 - 应用程序连接到 mongodb 并使用存储库进行测试(例如保存、删除)工作得很好,但我注意到测试运行(成功)后 mongodb。驱动程序最终抛出异常 - 看起来容器没有被正常关闭/停止 - 这可能吗?

如何启动容器的示例

companion object {
        @Container
        var mongoDBContainer = MongoDBContainer("mongo:4.4.2")

        @JvmStatic
        @DynamicPropertySource
        fun setProperties(registry: DynamicPropertyRegistry) {
            registry.add("spring.data.mongodb.uri") { mongoDBContainer.replicaSetUrl }
        }
    }

测试方法

@Test fun someTest() {
   autowiredRepository.save(document)
   ...
   ...
}

至于正在运行的类,我只是在它上面使用了@Testcontainers注释和@SpringBootTest,没有别的。

我最终遇到的例外是

com.mongodb.MongoSocketReadException: Prematurely reached end of stream
    at com.mongodb.internal.connection.SocketStream.read(SocketStream.java:112) ~[mongodb-driver-core-4.2.3.jar:na]
    at com.mongodb.internal.connection.SocketStream.read(SocketStream.java:131) ~[mongodb-driver-core-4.2.3.jar:na]
    at com.mongodb.internal.connection.InternalStreamConnection.receiveResponseBuffers(InternalStreamConnection.java:647) ~[mongodb-driver-core-4.2.3.jar:na]
    at com.mongodb.internal.connection.InternalStreamConnection.receiveMessageWithAdditionalTimeout(InternalStreamConnection.java:512) ~[mongodb-driver-core-4.2.3.jar:na]
    at com.mongodb.internal.connection.InternalStreamConnection.receiveCommandMessageResponse(InternalStreamConnection.java:355) ~[mongodb-driver-core-4.2.3.jar:na]
    at com.mongodb.internal.connection.InternalStreamConnection.receive(InternalStreamConnection.java:315) ~[mongodb-driver-core-4.2.3.jar:na]
    at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.lookupServerDescription(DefaultServerMonitor.java:215) ~[mongodb-driver-core-4.2.3.jar:na]
    at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:144) ~[mongodb-driver-core-4.2.3.jar:na]
    at java.base/java.lang.Thread.run(Thread.java:832) ~[na:na]

mongodb spring-boot kotlin testcontainers testcontainers-junit5
3个回答
13
投票

我遇到了同样的问题,并通过从容器中删除注释

@Container
并将其作为单例手动启动来解决它。 原因是
@Container
正在启动多个容器。第一个已被测试成功使用,其他则抛出
com.mongodb.MongoSocketReadException: Prematurely reached end of stream
异常。

更换这个:


    @Testcontainers  
    @DataMongoTest(excludeAutoConfiguration = EmbeddedMongoAutoConfiguration.class)  
    class UserRepositoryTest {  
    
        @Container  
        static MongoDBContainer mongoDBContainer = new MongoDBContainer("mongo:5.0.10");  
    
        @DynamicPropertySource  
        static void setProperties(DynamicPropertyRegistry registry) {  
            registry.add("spring.data.mongodb.uri", mongoDBContainer::getReplicaSetUrl);  
        }
    }

有了这个


    @Testcontainers  
    @DataMongoTest(excludeAutoConfiguration = EmbeddedMongoAutoConfiguration.class)  
    class UserRepositoryTest {  
    
        static MongoDBContainer mongoDBContainer = new MongoDBContainer("mongo:5.0.13");
    
        static {
            mongoDBContainer.start();
        }
    
        @DynamicPropertySource  
        static void setProperties(DynamicPropertyRegistry registry) {  
            registry.add("spring.data.mongodb.uri", mongoDBContainer::getReplicaSetUrl);  
        }
    }


0
投票

您是否尝试排除 spring 提供的默认 mongoEmbedded?

我不知道 Kotlin 中的情况,但在 Java 中是这样的:

@Testcontainers  
@DataMongoTest(excludeAutoConfiguration = EmbeddedMongoAutoConfiguration.class)  
class UserRepositoryTest {  

    @Container  
    static MongoDBContainer mongoDBContainer = new MongoDBContainer("mongo:5.0.10");  

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

0
投票

问题有点老了,答案看起来已经过时了。我想提出替代解决方案。

现在(3.4.1)注释

@Testcontainers
似乎没有必要。如果您使用 Spring Initializr 创建应用程序,选择 Mongo 和 Testcontainer,您将获得使用 Testcontainer 进行工作测试的示例代码,没有
@Testcontainers
注释,并且最后没有异常

© www.soinside.com 2019 - 2024. All rights reserved.