Лучший способ установить свойства testcontainer из файла по умолчанию applicationaton.yml в springboottest - PullRequest
0 голосов
/ 03 августа 2020

Я использую posgre sql testcontainer в springboottest. Поскольку у меня есть несколько тестов с использованием этого testcontainer, я использовал stati c testcontainer, который будет вызываться один раз для всех тестов 1 класса junit и завершать работу после выполнения всех тестов.

Это я реализовал с помощью ParameterResolver , BeforeEachCallback.

Проблема с этим подходом заключается в том, что метаданные источника данных, такие как jdb c -url, имя базы данных, хост, порт, настроенные в application.yml по умолчанию, не используются непосредственно в свойствах testcontainer, вместо этого я жестко запрограммировал их значения, потому что свойства springboot в это время недоступны.

есть ли лучший подход, где я могу использовать stati c testcontainers с функцией BeforeEachCallback, значения которой извлекаются из application.yml по умолчанию?

@SpringBootTest
class SampleTest extends TestContainerBase {

    @Test
    void test1() {
        //some code
    }

}

@ExtendWith(ContainerExtension.class)
@ResourceLock(Environment.ID)
public abstract class TestContainerBase {

    protected static String jdbcUrl;
    protected static String username;
    protected static String password;

    @BeforeAll
    static void prepareContainerEnvironment(Environment env) {
        jdbcUrl = env.getJdbcUrl();
        username = env.getUsername();
        password = env.getPassword();
    }

    @DynamicPropertySource
    static void dynamicPropertySource(DynamicPropertyRegistry registry) {

        registry.add("spring.datasource-.jdbc-url", () -> jdbcUrl);
        registry.add("spring.datasource-.username", () -> username);
        registry.add("spring.datasource-.password", () -> password);
        registry.add("spring.datasource-.driver-class-name", () -> "org.postgresql.Driver");
    }

}

public class ContainerExtension implements ParameterResolver, BeforeEachCallback {
    
    // overridden supportsParameter and resolveParameter
}

Я хочу, чтобы myDB, sa, sa читались из application.yml. Как я могу получить значения application.yml здесь, в этом классе? Поскольку контекст Springboot еще не загружен, я не могу придумать альтернативы для получения этих значений.

public class ContainerResource extends Environment {

    @Container
    protected static PostgreSQLContainer postgreSQLContainer =
            new PostgreSQLContainer("artifactory.devtools.syd.c1.macquarie.com:9996/postgres:11")
                    .withDatabaseName("myDB")
                    .withUsername("username")
                    .withPassword("password");
    
    ContainerEnvironmentResource() {
        postgreSQLContainer.start();
        this.setJdbcUrl(postgreSQLContainer.getJdbcUrl());
        this.setUsername(postgreSQLContainer.getUsername());
        this.setPassword(postgreSQLContainer.getPassword());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...