Есть ли способ выполнения последовательных n числовых интеграционных тестов для 1 экземпляра dockercompose (test-Containers) - PullRequest
0 голосов
/ 24 апреля 2020

Использование DockerComposeContainer из API тест-контейнеров в SpringBootApp У меня есть следующая проблема. Объект DockerComposeContainer из тестовых контейнеров должен быть аннотирован с помощью @ClassRule, чтобы запускаться и закрываться автоматически, что обусловливает необходимость в поле stati c из-за аннотации @ClassRule. Если я выполняю одиночный тест, он успешно завершается sh, но когда я выполняю более 1 последовательного теста, я получаю ошибку во втором тесте

Could not start container
org.testcontainers.containers.ContainerLaunchException: Aborting attempt to link to container cn6j5atqrtav_janusgraph_1 as it is not running
        at org.testcontainers.containers.GenericContainer..

, потому что я использую поле stati c для DockerComposeContainer. Если я использую только @Rule, я не могу передать экземпляр DockerComposeContainer во внутренний компонент класса @TestConfiguration, который использует это поле. Почему я должен использовать внутренний класс stati c, потому что я переопределяю некоторые bean-компоненты из контекста приложения SpringBoot. Вот небольшой пример:

@RunWith(SpringRunner.class)
public class IntegrationTestBase {

    private static final String DOCKER_COMPOSE_FILE = "src/test/resources/integration/docker-compose-cql-es.yml";

    @ClassRule
    public static DockerComposeContainer environment =
            new DockerComposeContainer(new File(DOCKER_COMPOSE_FILE))
                    .withExposedService("janusgraph", 8182, Wait.forListeningPort()
                            .withStartupTimeout(Duration.ofMinutes(1)));


    @TestConfiguration
    public static class ContextConfig {

        @Bean(Constants.GRAPH_TRAVERSAL_SOURCE)
        @Scope("prototype")
        public GraphTraversalSource graphTraversalSource() {
            org.apache.commons.configuration.Configuration remoteConfig = new BaseConfiguration();
            remoteConfig.addProperty("gremlin.remote.remoteConnectionClass", "org.apache.tinkerpop.gremlin.driver.remote.DriverRemoteConnection");
            remoteConfig.addProperty("gremlin.remote.driver.sourceName", "g");
            remoteConfig.addProperty("gremlin.remote.driver.clusterFile", "remote-objects.yaml");

            try {
                org.apache.commons.configuration.Configuration clusterConfig = new PropertiesConfiguration();
                clusterConfig.addProperty("hosts", new String[]{environment.getServiceHost("janusgraph", 8182)}); // I want to use environemnt here without beign static ?
                clusterConfig.addProperty("port", environment.getServicePort("janusgraph", 8182));
                clusterConfig.addProperty("serializer.className", GryoMessageSerializerV3d0.class.getName());
                clusterConfig.addProperty("serializer.config.ioRegistries", JanusGraphIoRegistry.class.getName());
                clusterConfig.addProperty("serializer.config.ioRegistries", JanusGraphIoRegistry.class.getName());
                final Cluster cluster = Cluster.open(clusterConfig);

                Constructor<DriverRemoteConnection> constructor = DriverRemoteConnection.class.getDeclaredConstructor(Cluster.class, boolean.class, String.class);
                constructor.setAccessible(true);
                DriverRemoteConnection connection = constructor.newInstance(cluster, true, "g");

                return JanusGraphFactory.open("inmemory").traversal().withRemote(connection);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    }
}

Одна вещь, которую я попробовал, это удалить stati c из DockerComposeContainer и использовать @Rule вместо @ClassRule и сделать внутренний класс не stati c но затем я не переопределяю текущую среду SpringBoot, и мне нужно использовать @Import IntegrationTestBase в классе Inner для @AutoWired DockerComposeContainer, и я получил проблему циклической зависимости таким образом. Извините, если вопрос стал слишком широким. Этот класс является базовым классом, который должен быть расширен тестовыми классами, потому что внутри него нет @Test. Ссылка, которая описывает конфигурацию теста SpringBoot https://howtodoinjava.com/spring-boot2/testing/springboot-test-configuration/

1 Ответ

1 голос
/ 24 апреля 2020

Объект DockerComposeContainer из тестовых контейнеров должен быть аннотирован @ClassRule, чтобы запускаться и закрываться автоматически

НЕ ДОЛЖНО, скорее СЛЕДУЕТ.

Вы можете отбросьте аннотацию и используйте шаблон Singleton Container , например.

...