如何通过测试容器启动 Informix?

我对在我的项目中使用测试容器非常感兴趣。

但是,我很难将其设置为与 Informix 一起使用。

请注意,我可以使用 Docker-for-Mac 启动一个 informix 容器,它将构建并启动。

虽然不确定它是否可以与测试容器一起使用。我希望它会。

这是我到目前为止所拥有的

测试类

package com.example.demo;


import com.github.dockerjava.api.command.CreateContainerCmd;

import org.junit.AfterClass;

import org.junit.BeforeClass;

import org.junit.Test;

import org.junit.runner.RunWith;

import org.springframework.boot.test.context.SpringBootTest;

import org.springframework.test.context.junit4.SpringRunner;

import org.testcontainers.containers.GenericContainer;

import org.testcontainers.containers.wait.strategy.HostPortWaitStrategy;

import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy;

import org.testcontainers.containers.wait.strategy.WaitAllStrategy;


import java.time.Duration;


import static org.junit.Assert.assertEquals;


@RunWith(SpringRunner.class)

@SpringBootTest

public class DemoApplicationTests {


  private static GenericContainer informix;


  @BeforeClass

  public static void init() {

    informix = new GenericContainer("ibmcom/informix-innovator-c")

        .withExposedPorts(9088)

        .withEnv("LICENSE", "accept")

        .withPrivilegedMode(true)

        .withCreateContainerCmdModifier(command -> ((CreateContainerCmd)command).withTty(Boolean.TRUE))

        .waitingFor(new WaitAllStrategy().withStrategy(new LogMessageWaitStrategy().withRegEx(".*listener on port.*\n"))

            .withStrategy(new HostPortWaitStrategy())

            .withStartupTimeout(Duration.ofMinutes(2)));


    informix.start();

  }


  @AfterClass

  public static void destroy(){

    informix.close();

  }


  @Test

  public void testDemo() {

    int foo = 1;

    assertEquals(foo, 1);

  }


}

容器启动然后永远挂起,永远不会进入测试


互换的青春
浏览 136回答 1
1回答

哆啦的时光机

Informix 的 docker 镜像配置错误。在 docker 容器中启动的服务器只会监听主机名,而不是本地主机。Testcontainers 使用“localhost”作为网络接口来连接到您的容器。因此,当您使用.withExposedPorts(9088)该端口时,该端口实际上并未暴露在 TestContainers 可以连接到的网络接口上。这就是为什么即使您等待日志消息,您仍然很可能遇到问题,您也在端口上等待并且它永远不可用。好消息是,这个问题现在已经修复,可以通过下载最新的 Informix docker 镜像来使用ibmcom/informix-developer-database:latest获取最新的 14.10 docker 镜像下面是我运行的代码,用于验证新图像是否与 TestContainers 一起更好地工作。public class DockerTest {&nbsp; &nbsp; GenericContainer<?>container&nbsp; = new GenericContainer<>("ibmcom/informix-developer-database:latest")&nbsp; &nbsp; &nbsp; &nbsp; .withExposedPorts(9088, 9089, 27017, 27018, 27883).withEnv("LICENSE", "accept");@Testpublic void testIfxContainer() throws Exception {&nbsp; &nbsp; container.start();&nbsp; &nbsp; System.out.println("Informix started");&nbsp; &nbsp; //test the connection&nbsp; &nbsp; try(Connection c = DriverManager.getConnection("jdbc:informix-sqli:localhost:"&nbsp; + container.getFirstMappedPort() + "/sysmaster:user=informix;password=your-password")) {&nbsp; &nbsp; &nbsp; try(Statement s = c.createStatement(); ResultSet rs = s.executeQuery("SELECT FIRST 10 tabname from systables");) {&nbsp; &nbsp; &nbsp; &nbsp; while(rs.next()) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println(r.getString(1));&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java