Как я могу переопределить spring.data.mongodb.uri для использования mongo TestContainer в тестах загрузки Spring?

#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. Я рад, что мой вопрос может помочь вам найти решение 🙂