Проблема тестирования интеграции с использованием тестовых контейнеров и докера "Причина: java.lang.NullPointerException: containerId не был указан" - PullRequest
0 голосов
/ 05 февраля 2019

Я супер новичок в testcontainers .Я даже не уверен, что то, что я пытаюсь сделать, имеет какой-то смысл или есть лучший подход для этого.

Цель: написать интеграционный тест для моего репозитория MongoDb.Я использую Docker, Maven.Jdk11, Spring Boot 2.

Мой родительский тестовый класс

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = {PostServiceApplication.class},
        properties = "spring.cloud.config.enabled:true",
        webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public abstract class AbstractIntegrationTest {

    private static final String MONGO_CONTAINER = "mongo:3.1.5";
    private static final Integer MONGO_PORT = 27017;
    private static final int CONFIG_SERVICE_PORT = 8888;

    @ClassRule
    public static GenericContainer mongo = new GenericContainer(MONGO_CONTAINER).withExposedPorts(MONGO_PORT);

    @ClassRule
    public static DockerComposeContainer configService =
            new DockerComposeContainer(new File("src/test/resources/configservice/docker-compose.yml"))
                    .withExposedService("ConfigService", CONFIG_SERVICE_PORT);


}

ConfigService - это, по сути, сервис конфигурации SpringCloud, который является зависимостью от тестируемой службы.

Мой docker-compse.yaml

configservice:
  image: ponte/maven-3.5.4-jdk-11-slim-non-root
  ports:
    - "8888:8888"
  volumes:
    - "~/.m2/repository/app/configservice/configservice/0.0.1-SNAPSHOT/configservice-0.0.1-SNAPSHOT.jar:/configservice.jar"
  environment:
    - JAVA_OPTS=""
  hostname: "configservice"
  entrypoint: [ "sh", "-c", "java $JAVA_OPTS -jar /configservice.jar" ]

Мой тестовый класс

public class RepoTest extends AbstractIntegrationTest {

    @Autowired
    private MongoRepo repo;


    @Test
    public void test1() {
        assertNotNull(panoramaPostRepo);

        var post = Post.builder()
                .originalFileName("somefile.jpg")
                .dimension(new Dimension(1200, 480))
                .size(23000L)
                .uploadTime(ZonedDateTime.now())
                .build();


        var savedPost = repo.save(post);
        assertNotNull(savedPost);
        assertNotNull(savedPost.getId());
    }
}

Я получаю следующую ошибку:

org.testcontainers.containers.ContainerLaunchException: Container startup failed

    at org.testcontainers.containers.GenericContainer.doStart(GenericContainer.java:229)
    at org.testcontainers.containers.GenericContainer.start(GenericContainer.java:207)
    at org.testcontainers.containers.DockerComposeContainer.startAmbassadorContainers(DockerComposeContainer.java:249)
    at org.testcontainers.containers.DockerComposeContainer.start(DockerComposeContainer.java:159)
    at org.testcontainers.containers.DockerComposeContainer.starting(DockerComposeContainer.java:127)
    at org.testcontainers.containers.FailureDetectingExternalResource$1.evaluate(FailureDetectingExternalResource.java:29)
    at org.testcontainers.containers.FailureDetectingExternalResource$1.evaluate(FailureDetectingExternalResource.java:30)
    at org.junit.rules.RunRules.evaluate(RunRules.java:20)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Caused by: org.rnorth.ducttape.RetryCountExceededException: Retry limit hit with exception
    at org.rnorth.ducttape.unreliables.Unreliables.retryUntilSuccess(Unreliables.java:83)
    at org.testcontainers.containers.GenericContainer.doStart(GenericContainer.java:222)
    ... 14 more
Caused by: java.lang.NullPointerException: containerId was not specified
    at org.testcontainers.shaded.com.google.common.base.Preconditions.checkNotNull(Preconditions.java:228)
    at com.github.dockerjava.core.command.LogContainerCmdImpl.withContainerId(LogContainerCmdImpl.java:78)
    at com.github.dockerjava.core.command.LogContainerCmdImpl.<init>(LogContainerCmdImpl.java:38)
    at com.github.dockerjava.core.DockerClientImpl.logContainerCmd(DockerClientImpl.java:359)
    at org.testcontainers.dockerclient.AuditLoggingDockerClient.logContainerCmd(AuditLoggingDockerClient.java:22)
    at org.testcontainers.containers.GenericContainer.tryStart(GenericContainer.java:285)
    at org.testcontainers.containers.GenericContainer.lambda$doStart$0(GenericContainer.java:224)
    at org.rnorth.ducttape.unreliables.Unreliables.retryUntilSuccess(Unreliables.java:76)
    ... 15 more

Я также хотел бы знать, есть ли улучшение в том, что я делаю?

1 Ответ

0 голосов
/ 05 февраля 2019

В вашем docker-compose.yaml у вас есть configservice, но позже в коде: .withExposedService("ConfigService", ...).

Он чувствителен к регистру.

...