【问题标题】:How to get @Testcontainers(disabledWithoutDocker = true) behaviour in junit4/testcontainers如何在 junit4/testcontainers 中获得 @Testcontainers(disabledWithoutDocker = true) 行为
【发布时间】:2020-10-14 05:18:20
【问题描述】:

我的代码库很古老并且被锁定在 JUnit4 中。我想将 testcontainers 与项目集成以将 docker 容器合并到自动化测试中。

我的开发箱(我控制)运行 docker,但是,我的 CI 系统(我不控制)没有。

如果我可以使用 JUnit5,我只需添加 @Testcontainers(disabledWithoutDocker = true) 注释,基于 docker 的测试将在我的开发盒上愉快地运行,而在 CI 机器上被禁用。

JUnit4 等价于@Testcontainers(disabledWithoutDocker = true) 是什么?

【问题讨论】:

    标签: docker junit4 junit5 testcontainers


    【解决方案1】:

    我不确定在 JUnit 4 的 Testcontainers 中是否有现成可用的东西。您可以使用一些自定义代码来镜像 JUnit 5 功能。

    首先,您需要一种有条件地执行测试的方法。已经有一个good answer 可用。基本上,您为此使用 JUnit 4 Assumptions:

     @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 相同的方法。

    【讨论】:

    • 我已经在 1.15.3 上尝试过这个解决方案,即使现在有一个方法 'DockerClientFactory.instance().isDockerAvailable()',但尝试不同的“策略”和然后它失败了。在我的情况下,可能是因为 docker 是作为服务安装的,而我刚刚停止了它(Linux 桌面)。
    猜你喜欢
    • 1970-01-01
    • 2018-06-26
    • 2021-10-28
    • 2021-07-14
    • 2020-08-14
    • 2020-12-19
    • 2019-06-25
    • 2022-09-30
    • 2021-12-22
    相关资源
    最近更新 更多