#java #spring #junit4 #testcontainers
#java #весна #junit4 #тестовые контейнеры
Вопрос:
Всем привет 🙂 у меня есть 3 вопроса :
- Как повторно использовать TestContainer с Junit 4?
- Как я могу проверить количество контейнеров, используемых во время моего теста?
- По умолчанию новый контейнер запускается
@Test
для каждого или для всего класса?
Заранее благодарю вас за ваши ответы
PostgresTestContainer.java
@ContextConfiguration(initializers = PostgresTestContainer.Initializer.class)
public abstract class PostgresTestContainer {
@ClassRule
public static PostgreSQLContainer postgresContainer = new PostgreSQLContainer(TCConfig.POSTGRESQL_VERSION.toString())
.withDatabaseName(TCConfig.TC_DBNAME)
.withUsername(TCConfig.TC_USERNAME)
.withPassword(TCConfig.TC_PASSWORD);
public static class Initializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
private static String stringConnection = postgresContainer.getJdbcUrl();
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
TestPropertyValues values = TestPropertyValues.of(
"spring.datasource.url=" stringConnection,
"spring.datasource.username=" TCConfig.TC_USERNAME,
"spring.datasource.password=" TCConfig.TC_PASSWORD
);
values.applyTo(applicationContext);
}
}
}
PostgreSQL12Test.java
@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles("test")
public class PostgreSQL12_Test extends PostgresTestContainer {
@Autowired
private MemberService memberService;
@Autowired
private Flyway flyway;
@Before
public void initialize() {
flyway.migrate();
}
@Test
public void shoudRunPostgreSQLContainer() throws Exception {
Connection connection = DriverManager.getConnection(postgresContainer.getJdbcUrl(), postgresContainer.getUsername(), postgresContainer.getPassword());
ResultSet resultSet = connection.createStatement().executeQuery("SELECT 666");
resultSet.next();
int result = resultSet.getInt(1);
assertThat(result).isEqualByComparingTo(666);
}
}
Версии
TestContainers - Postgresql : 1.13.0
Spring Boot : 2.0.0 ( Junit 4 )
Docker : 19.03.11
Os : 20.04.1 LTS (Focal Fossa)
Ответ №1:
-
Как повторно использовать TestContainer с Junit 4?
Он уже должен работать так, как вы написали свой тест. У вас есть контейнер с аннотацией @ClassRule, поэтому его следует загружать только один раз.
-
Как я могу проверить количество контейнеров, используемых во время моего теста?
Поместите точку останова в свой метод тестирования и запустите
docker ps
в терминале. -
По умолчанию новый контейнер запускается для каждого @Test или для всего класса?
С помощью @ClassRule он должен быть создан для класса. Вы можете просто удалить эту аннотацию, и тогда жизненный цикл контейнера будет управляться самой java (один раз, если поле статическое, и для каждого метода тестирования, если это не так)
Комментарии:
1.
docker ps
покажите мне текущие контейнеры, но возможно ли регистрировать старые (закрытые) контейнеры?2. существует docker ps -a, не уверен, что это то, что вам нужно.
Ответ №2:
Чтобы повторно использовать контейнер для всего тестового класса, просто используйте static
без @ClassRule
или @Rule
.
public class PostgresTestContainer {
public static final PostgreSQLContainer POSTGRESQL_CONTAINER = new PostgreSQLContainer<>(DockerImageName.parse("postgres:9.6.12"))
.withDatabaseName("db_name")
.withUsername("db_user")
.withPassword("db_pass");
static {
POSTGRE_SQL_CONTAINER.start();
}
}