容器测试使用 Maven 失败,但使用 JUnit 成功

问题描述

在 IntelliJ IDEA(版本 Community 2021.1)中通过 Maven(版本3.8.1)运行 JUnit 集成测试时遇到问题。我的 Docker 桌面版本是 3.3.1 (63152)。我在 M1(ARM 架构)上使用 Apple Macbook。

测试容器是基于 Postgre 的 TimescaleDB(timescale-pgcron:latest 是我的 Docker 桌面中的预构建映像):

public class MyTimescaleContainer extends PostgresqlContainer<MyTimescaleContainer> {

    private MyTimescaleContainer() {
        super(DockerImageName.parse("timescale-pgcron").asCompatibleSubstituteFor("postgres").withTag("latest"));
    }

    public static MyTimescaleContainer getInstance() {
        return LazyHolder.INSTANCE;
    }

    @Override
    public void start() {
        super.start();
    }

    @Override
    public void stop() {
        //do nothing,JVM handles shut down
    }

    private static class LazyHolder {
        static final MyTimescaleContainer INSTANCE = new MyTimescaleContainer()
                .withReuse(true)
                .waitingFor(Wait.forHealthcheck());
    }
}

测试容器依赖:

<dependency>
    <groupId>org.testcontainers</groupId>
    <artifactId>testcontainers</artifactId>
    <version>1.15.0-rc2</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.testcontainers</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>1.15.0-rc2</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.testcontainers</groupId>
    <artifactId>postgresql</artifactId>
    <version>1.15.0-rc2</version>
    <scope>test</scope>
</dependency>

当我直接通过 JUnit 执行我的测试时(右键单击我的测试包并按 Run 'Tests in '<my test package>''),容器正常启动并且测试成功运行。但是,当我通过 Maven 运行它时,它会删除

[ERROR] com.mypackage.MyTest  Time elapsed: 0.001 s  <<< ERROR!
org.testcontainers.containers.ContainerLaunchException: Container startup Failed
        at com.mypackage.MyTest.startUp(MyTest.java:31)
Caused by: org.testcontainers.containers.ContainerFetchException: Can't get Docker image: RemoteDockerImage(imageName=timescale-pgcron:latest,imagePullPolicy=DefaultPullPolicy())
        at com.mypackage.MyTest.startUp(MyTest.java:31)
Caused by: java.lang.IllegalStateException: Could not find a valid Docker environment. Please see logs and check configuration
        at com.mypackage.MyTest.startUp(MyTest.java:31)

以前有人遇到过这个问题吗? 使用运行 Maven 的作业中的这些设置,该测试也在 CircleCI 上运行良好(如果没有这些设置,作业将失败并出现上述相同的 Docker 错误):

machine:
  image: ubuntu-2004:202010-01

我一开始以为可能和苹果的 M1 平台有关,因为绝大多数镜像都不支持,其实是通过 Docker 的 --platform linux/amd64 标志绕过的,但是我没有指定任何标志的时候我直接通过 JUnit 运行测试,它仍然成功地启动了容器。那么 Maven 有什么问题?

更新。 这是我直接从 docker ps 运行 JUnit 时 Run 'Tests in...' 的屏幕截图,如您所见,timescale-pgcron:latest 已启动:

enter image description here

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)