我的代码库很古老,并且被锁定在JUnit4中。我想将testcontainer与该项目集成,以将docker容器合并到自动化测试中。
我的开发箱(由我控制)运行docker,但是我的CI系统(不受我控制)却没有。
如果可以使用JUnit5,则只需添加@Testcontainers(disabledWithoutDocker = true)
批注,基于docker的测试将在我的dev框中愉快地运行,而在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()
提取为一个抽象类,还包括@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
使用相同的方法。