如何在 junit4/testcontainers 中获得 @Testcontainers(disabledWithoutDocker = true) 行为
How to get @Testcontainers(disabledWithoutDocker = true) behaviour in junit4/testcontainers
我的代码库很古老并且被锁定在 JUnit4 中。我想将 testcontainers 与项目集成,以将 docker 个容器合并到自动化测试中。
我的开发箱(我控制)运行s docker,然而,我的 CI 系统(我不控制)没有。
如果我可以使用 JUnit5,我将只添加 @Testcontainers(disabledWithoutDocker = true)
注释,基于 docker 的测试将 运行 在我的开发箱上愉快地 运行,而在 CI机.
什么是 JUnit4 等同于 @Testcontainers(disabledWithoutDocker = true)
?
我不确定 JUnit 4 的 Testcontainers 中是否有现成的东西。您可以使用一些自定义代码来镜像 JUnit 5 功能。
首先,您需要一种有条件地执行测试的方法。已有 good answer 可用。基本上你为此使用 JUnit 4 假设:
@Before
public void beforeMethod() {
org.junit.Assume.assumeTrue(someCondition());
// rest of setup.
}
所有 Docker 相关测试都需要这个。
接下来,someCondition()
应该评估Docker是否可用。当前的 Testcontainers (1.14.3) 版本使用以下代码部分 @Testcontainers(disabledWithoutDocker = true)
:
private ConditionEvaluationResult evaluate(Testcontainers testcontainers) {
if (testcontainers.disabledWithoutDocker()) {
if (isDockerAvailable()) {
return ConditionEvaluationResult.enabled("Docker is available");
}
return ConditionEvaluationResult.disabled("disabledWithoutDocker is true and Docker is not available");
}
return ConditionEvaluationResult.enabled("disabledWithoutDocker is false");
}
boolean isDockerAvailable() {
try {
DockerClientFactory.instance().client();
return true;
} catch (Throwable ex) {
return false;
}
}
因此您可以将 isDockerAvailable()
提取到例如一个摘要 class,其中还包括 @Before
并自行处理:
public abstract class DockerizedTest {
@Before
public void shouldRunTest() {
org.junit.Assume.assumeTrue(isDockerAvailable());
}
boolean isDockerAvailable() {
try {
DockerClientFactory.instance().client();
return true;
} catch (Throwable ex) {
return false;
}
}
}
现在所有 Docker 相关测试都可以扩展 DockerizedTest
。每当假设评估为假时,测试将被忽略。
如果@Before
太晚,你可以使用与@BeforeClass
相同的方法。
我的代码库很古老并且被锁定在 JUnit4 中。我想将 testcontainers 与项目集成,以将 docker 个容器合并到自动化测试中。
我的开发箱(我控制)运行s docker,然而,我的 CI 系统(我不控制)没有。
如果我可以使用 JUnit5,我将只添加 @Testcontainers(disabledWithoutDocker = true)
注释,基于 docker 的测试将 运行 在我的开发箱上愉快地 运行,而在 CI机.
什么是 JUnit4 等同于 @Testcontainers(disabledWithoutDocker = true)
?
我不确定 JUnit 4 的 Testcontainers 中是否有现成的东西。您可以使用一些自定义代码来镜像 JUnit 5 功能。
首先,您需要一种有条件地执行测试的方法。已有 good answer 可用。基本上你为此使用 JUnit 4 假设:
@Before
public void beforeMethod() {
org.junit.Assume.assumeTrue(someCondition());
// rest of setup.
}
所有 Docker 相关测试都需要这个。
接下来,someCondition()
应该评估Docker是否可用。当前的 Testcontainers (1.14.3) 版本使用以下代码部分 @Testcontainers(disabledWithoutDocker = true)
:
private ConditionEvaluationResult evaluate(Testcontainers testcontainers) {
if (testcontainers.disabledWithoutDocker()) {
if (isDockerAvailable()) {
return ConditionEvaluationResult.enabled("Docker is available");
}
return ConditionEvaluationResult.disabled("disabledWithoutDocker is true and Docker is not available");
}
return ConditionEvaluationResult.enabled("disabledWithoutDocker is false");
}
boolean isDockerAvailable() {
try {
DockerClientFactory.instance().client();
return true;
} catch (Throwable ex) {
return false;
}
}
因此您可以将 isDockerAvailable()
提取到例如一个摘要 class,其中还包括 @Before
并自行处理:
public abstract class DockerizedTest {
@Before
public void shouldRunTest() {
org.junit.Assume.assumeTrue(isDockerAvailable());
}
boolean isDockerAvailable() {
try {
DockerClientFactory.instance().client();
return true;
} catch (Throwable ex) {
return false;
}
}
}
现在所有 Docker 相关测试都可以扩展 DockerizedTest
。每当假设评估为假时,测试将被忽略。
如果@Before
太晚,你可以使用与@BeforeClass
相同的方法。