SpringBoot应用程序的GenericContainer:超时等待容器端口打开

时间:2017-12-11 10:48:26

标签: java spring-boot integration-testing spring-boot-test testcontainers

我会用TestContainers测试一个spring boot应用程序,但我不明白正确的方法。

这是我的控制者:

@RestController
@RequestMapping(value = "snip")
public class Controller {

    @RequestMapping(method = RequestMethod.GET, path = "/hello", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<String> hello (){
        return new ResponseEntity<String>("Hello World!!", HttpStatus.OK);
    }
}

这是我的测试课程:

public class ControllerTest {

    @Rule
    public GenericContainer container = new GenericContainer(
            new ImageFromDockerfile()
                    .withFileFromFile("target/springboot-testcontainers-snip-1.0-SNAPSHOT.jar", new File("target/springboot-testcontainers-snip-1.0-SNAPSHOT.jar"))
                    .withFileFromPath("./Dockerfile", new File("./Dockerfile").toPath())
    )
            .withExposedPorts(8080);

    @Before
    public void setup() {
        RestAssured.baseURI = "http://" + container.getContainerIpAddress() + ":" + container.getMappedPort(8080);
    }

    @Test
    public void testHello() {
        Response response = get("/snip/hello");
        assertEquals(response.statusCode(), 200);
    }
}

Dockerfile:

FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD target/springboot-testcontainers-snip-1.0-SNAPSHOT.jar app-snip.jar
RUN sh -c 'touch /app-snip.jar'
ENV JAVA_OPTS=""
ENTRYPOINT [ "java","-Djava.security.egd=file:/dev/./urandom","-jar","/app-snip.jar" ]

POM:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.8.RELEASE</version>
    </parent>

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-rest</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- logging -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-yaml</artifactId>
            <version>2.8.10</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.8.10</version>
            <exclusions>
                <exclusion>
                    <groupId>com.fasterxml.jackson.core</groupId>
                    <artifactId>jackson-core</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.fasterxml.jackson.core</groupId>
                    <artifactId>jackson-annotations</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.8.10</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.8.10</version>
        </dependency>

        <!-- integration test -->
        <dependency>
            <groupId>org.testcontainers</groupId>
            <artifactId>testcontainers</artifactId>
            <version>1.4.3</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.jayway.restassured</groupId>
            <artifactId>rest-assured</artifactId>
            <version>2.9.0</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

最后是错误:

2017-12-11 11:28:23,023 [dockerjava-netty-1-5] INFO :  [testcontainers/gwtpjdsqjcomgisb] STDOUT: 2017-12-11 10:27:42.631  INFO 1 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2017-12-11 11:28:23,024 [dockerjava-netty-1-5] INFO :  [testcontainers/gwtpjdsqjcomgisb] STDOUT: 2017-12-11 10:27:42.752  INFO 1 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2017-12-11 11:28:23,024 [dockerjava-netty-1-5] INFO :  [testcontainers/gwtpjdsqjcomgisb] STDOUT: 2017-12-11 10:27:42.768  INFO 1 --- [           main] c.s.Application                          : Started Application in 10.637 seconds (JVM running for 12.776)

org.testcontainers.containers.ContainerLaunchException: Container startup failed

    at org.testcontainers.containers.GenericContainer.start(GenericContainer.java:189)
    at org.testcontainers.containers.GenericContainer.starting(GenericContainer.java:544)
    at org.testcontainers.containers.FailureDetectingExternalResource$1.evaluate(FailureDetectingExternalResource.java:29)
    at org.junit.rules.RunRules.evaluate(RunRules.java:20)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    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.start(GenericContainer.java:182)
    ... 17 more
Caused by: org.testcontainers.containers.ContainerLaunchException: Could not create/start container
    at org.testcontainers.containers.GenericContainer.tryStart(GenericContainer.java:256)
    at org.testcontainers.containers.GenericContainer.lambda$start$0(GenericContainer.java:184)
    at org.rnorth.ducttape.unreliables.Unreliables.retryUntilSuccess(Unreliables.java:76)
    ... 18 more
Caused by: org.testcontainers.containers.ContainerLaunchException: Timed out waiting for container port to open (localhost:32775 should be listening)
    at org.testcontainers.containers.wait.HostPortWaitStrategy.waitUntilReady(HostPortWaitStrategy.java:91)
    at org.testcontainers.containers.GenericContainer$AbstractWaitStrategy.waitUntilReady(GenericContainer.java:943)
    at org.testcontainers.containers.GenericContainer.waitUntilContainerStarted(GenericContainer.java:466)
    at org.testcontainers.containers.GenericContainer.tryStart(GenericContainer.java:235)

从日志中可以看出&#39; spring boot&#39;是正确的, 问题在哪里?

我使用的是Mac(sierra 10.13.1) Docker版本17.09.0-ce,构建afdb6d4

提前致谢!

0 个答案:

没有答案