为什么Micronaut Test关闭了MongoClient连接



我正在使用MongoDB进行测试。代替Micronaut测试资源,我使用本地托管的docker容器作为数据库(我更喜欢看到结果)。我的许多测试依赖于MongoDB,但有些抛出错误:

17:34:09.134 [default-nioEventLoopGroup-3-4] INFO  org.mongodb.driver.connection - Opened connection [connectionId{localValue:6, serverValue:26}] to localhost:27018
17:34:09.329 [default-nioEventLoopGroup-3-10] ERROR InternalError - 
java.lang.IllegalStateException: state should be: open
at com.mongodb.assertions.Assertions.isTrue(Assertions.java:79)
at com.mongodb.internal.connection.BaseCluster.getDescription(BaseCluster.java:166)
at com.mongodb.internal.connection.SingleServerCluster.getDescription(SingleServerCluster.java:44)
at com.mongodb.client.internal.MongoClientDelegate.getConnectedClusterDescription(MongoClientDelegate.java:144)
at com.mongodb.client.internal.MongoClientDelegate.createClientSession(MongoClientDelegate.java:101)
at com.mongodb.client.internal.MongoClientImpl.startSession(MongoClientImpl.java:143)
at com.mongodb.client.internal.MongoClientImpl.startSession(MongoClientImpl.java:132)
at io.micronaut.data.mongodb.operations.DefaultMongoRepositoryOperations.withClientSession(DefaultMongoRepositoryOperations.java:753)
at io.micronaut.data.mongodb.operations.DefaultMongoRepositoryOperations.findAll(DefaultMongoRepositoryOperations.java:253)
at io.micronaut.data.runtime.intercept.DefaultFindAllInterceptor.intercept(DefaultFindAllInterceptor.java:51)
at io.micronaut.data.runtime.intercept.DefaultFindAllInterceptor.intercept(DefaultFindAllInterceptor.java:35)
at io.micronaut.data.intercept.DataIntroductionAdvice.intercept(DataIntroductionAdvice.java:81)
at io.micronaut.aop.chain.MethodInterceptorChain.proceed(MethodInterceptorChain.java:137)
at io.micronaut.validation.ValidatingInterceptor.intercept(ValidatingInterceptor.java:143)
at io.micronaut.aop.chain.MethodInterceptorChain.proceed(MethodInterceptorChain.java:137)

我该怎么做才能使所有的测试都打开状态?

通过替换DefaultMongoClientFactory解决了这个问题。preDestroy动作中矿坑工厂版和微太空版的区别

at DefaultMongoClientFactory: 45

@Bean(preDestroy = "close")

测试的解决方案:

package org.example.util.mongo
import com.mongodb.MongoClientSettings
import com.mongodb.client.MongoClient
import com.mongodb.client.MongoClients
import io.micronaut.configuration.mongo.core.DefaultMongoConfiguration
import io.micronaut.configuration.mongo.sync.DefaultMongoClientFactory
import io.micronaut.context.annotation.*
import jakarta.inject.Singleton

@Factory
@Requires(
classes = [MongoClient::class],
beans = [DefaultMongoConfiguration::class]
)
@Replaces(DefaultMongoClientFactory::class)
class MongoClientFactoryForTest {
@Primary
@Singleton
@Replaces(MongoClient::class)
fun mongoClient(settings: MongoClientSettings): MongoClient {
return MongoClients.create(settings)
}
}
@MicronautTest
@Requires(bean = MongoClientFactoryForTest::class)
abstract class IntegrationTestV1(body: FunSpec.() -> Unit = {}) : FunSpec(body) {

Micronaut-data团队或Micronaut-test团队需要注释:D

最新更新