Я использую 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());
}
}