首页 > 解决方案 > 容器测试使用 Maven 失败,但使用 JUnit 成功

问题描述

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

testcontainer 是基于 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/amd64flag绕过的,但是我直接通过JUnit跑测试的时候没有指定任何flag,而且它仍然成功地启动了容器。那么 Maven 有什么问题呢?

UPD。这是docker ps我直接从 运行 JUnit 时的屏幕截图Run 'Tests in...',如您所见,timescale-pgcron:latest它被旋转起来: 在此处输入图像描述

标签: javadockermavenjunittestcontainers

解决方案


推荐阅读