Как повторно использовать TestContainer? (Junit 4)

#java #spring #junit4 #testcontainers

#java #весна #junit4 #тестовые контейнеры

Вопрос:

Всем привет 🙂 у меня есть 3 вопроса :

  1. Как повторно использовать TestContainer с Junit 4?
  2. Как я могу проверить количество контейнеров, используемых во время моего теста?
  3. По умолчанию новый контейнер запускается @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:

  1. Как повторно использовать TestContainer с Junit 4?

    Он уже должен работать так, как вы написали свой тест. У вас есть контейнер с аннотацией @ClassRule, поэтому его следует загружать только один раз.

  2. Как я могу проверить количество контейнеров, используемых во время моего теста?

    Поместите точку останова в свой метод тестирования и запустите docker ps в терминале.

  3. По умолчанию новый контейнер запускается для каждого @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();
    }
}