Я о тестировании с использованием MongoDB. Вместо тестовых ресурсов Micronaut я использую локальный док-контейнер для базы данных (я предпочитаю видеть результат). Многие мои тесты зависят от 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. Разница между шахтной фабрикой и изданием Micronaut в действии preDestroy
в 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