java - 容器测试使用 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/amd64
flag绕过的,但是我直接通过JUnit跑测试的时候没有指定任何flag,而且它仍然成功地启动了容器。那么 Maven 有什么问题呢?
UPD。这是docker ps
我直接从 运行 JUnit 时的屏幕截图Run 'Tests in...'
,如您所见,timescale-pgcron:latest
它被旋转起来:
解决方案
推荐阅读
- c# - 如何模拟返回 void 而不是使用静态构造函数的静态初始化方法?
- python - 通过 Python 在 Kali-Linux 的终端中执行命令
- windows - 为什么我在使用 mkvpropedit 编辑文件时出现此错误?
- javascript - 根据中的特定文本删除各种div
- reactjs - react编译失败
- java - 具有双向引用的休眠执行顺序
- java - Checkmarx:Web 应用程序的数据访问层中的错误处理不当
- graph-theory - 是否有任何经典算法可以以最少的步骤将一棵树(或图)转换为另一棵树(或图)
- angular - Angular HttpClient:如果 get() 失败,则执行 post()
- python - 多元线性回归 - 改进 R 平方