#spring #mongodb #spring-boot #testcontainers
Вопрос:
Я пытаюсь реализовать кучу тестов с помощью тестового контейнера Mongo. Я вижу, что тестовый контейнер успешно запускает экземпляр Mongod в docker, потому что я могу подключиться к нему с помощью любого клиента Mongo.
Я использую DynamicPropertySource
для переопределения spring.data.mongodb.uri
на один из TestContainer.
@DynamicPropertySource
static void mongoDbProperties(DynamicPropertyRegistry registry) {
registry.add("spring.data.mongodb.uri",
() -> MongoInitializer.MongoContainerSingleton.getInstance().getReplicaSetUrl("testdb"));
}
Однако в журналах я вижу тайм-аут, потому что MongoTemplate все еще пытается подключиться к localhost:27017 вместо номера порта, указанного в тестовом контейнере.
Когда я проверяю context.getEnvironment()
, я вижу, что spring.data.mongodb.uri
содержит правильный uri для тестового контейнера.
Я также удалил свойство из application.properties и попытался добавить в свой тест следующее.
@TestPropertySource(properties = "spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration")
Ничего не помогало.
Как я могу заставить MongoTemplate подключаться к TestContainer во время выполнения тестов, все еще используя значение из application.properties в противном случае?
Комментарии:
1. Вы вручную настраиваете
MongoTemplate
или используете автоматическую настройку с момента загрузки Spring?2. Я расширяю конфигурацию AbstractMongoClientConfiguration, так что, я думаю, именно отсюда берется MongoTemplate. Я ожидал бы, что ApplicationContextInitializer из тестового пакета будет запущен до запуска MongoTemplate? Или это слишком упрощенный взгляд на вещи?
Ответ №1:
@rieckpil указал мне правильное направление … Спасибо.
Мне просто нужно было заставить Spring использовать свойство spring.data.mongodb.uri, переопределив функцию MongoDbFactory() в конфигурации AbstractMongoClientConfiguration.
@Bean
public MongoDatabaseFactory mongoDbFactory() {
return new SimpleMongoClientDatabaseFactory(
new ConnectionString(Objects.requireNonNull(env.getProperty("spring.data.mongodb.uri")))
);
}
Свойство, заданное @DynamicPropertySource в моем тесте, затем имеет приоритет над свойством из application.properties.
getDatebaseName() из AbstractMongoClientConfiguration необходимо реализовать, но игнорируется, потому что я не использую его в своей реализации MongoDbFactory().
Комментарии:
1. Я рад, что мой вопрос может помочь вам найти решение 🙂