gpt4 book ai didi

docker - 如何在junit4/testcontainers中获得@Testcontainers(disabledWithoutDocker = true)行为

转载 作者:行者123 更新时间:2023-12-02 18:09:55 25 4
gpt4 key购买 nike

我的代码库很古老,并且被锁定在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使用相同的方法。

关于docker - 如何在junit4/testcontainers中获得@Testcontainers(disabledWithoutDocker = true)行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62546724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com