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

10-02 18:58