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

toiithl6  于 2022-11-03  发布在  Go
关注(0)|答案(2)|浏览(76)

我正在一个Spring Boot Kotlin项目中设置集成测试,使用的是testcontainers:mongodb。
我已经设置了一个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]
qjp7pelc

qjp7pelc1#

您是否尝试排除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);  
    }
}
dz6r00yl

dz6r00yl2#

我也遇到了同样的问题,我通过从容器中删除注解@Container并手动将其作为Singleton启动来解决这个问题。原因是@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);  
        }
    }

相关问题