简体   繁体   中英

Integration test problem using test containers and docker “Caused by: java.lang.NullPointerException: containerId was not specified”

I am super new to testcontainers . I am not even sure what I am trying to do make any sense or if there is a better approach for it.

Goal: Write an integration test for my MongoDb Repository. I am using Docker, Maven. Jdk11, Spring Boot 2.

My parent test class

@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 is basically the SpringCloud configuration service which is a dependency to the service under the test.

My 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" ]

My test class

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());
    }
}

I am getting the following error:

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

I also like to know is there any enhancement on what I am doing?

In your docker-compose.yaml, you have configservice , but later in the code: .withExposedService("ConfigService", ...) .

It is case sensitive.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM