如何在不创建循环依赖的情况下创建可重用的测试代码?

How can I create reusable test code without creating circular dependencies?

考虑两个项目。

在 mycompany-foo 中,我定义了一些我想在许多其他项目中使用的对象。为了方便代码重用,mycompany-foo-tests定义了可以匹配mycompany-foo对象的hamcrest匹配器。

问题是 mycompany-foo-tests 将依赖于 mycompany-foo 以便我为其创建匹配器。然后 mycompany-foo 将依赖于 mycompany-foo-tests 以便我可以在 mycompany-foo 的测试中进行一些匹配。这会产生循环依赖。我想避免的事情。

我解决了这个问题,只需将匹配器添加到 mycompany-foo,删除 "tests" 项目,并将包含匹配器的测试 jar 导出为 "test-jar"。

一切都很顺利,直到我得知 Atlassian 的三叶草将它创建的工件安装到我的 m2 存储库中 [1]。这会覆盖我的测试 jar 并导致下游项目在无法初始化我的匹配器的三叶草版本时失败。

我看到的建议是不要创建测试罐,而是回到我之前做的事情。也就是说,有一个完全独立的匹配器项目。有没有办法在不产生循环依赖的情况下做到这一点?

[1] https://jira.atlassian.com/browse/CLOV-331

  1. 不要将生产代码及其 tests/test-utils 分离到单独的项目中。
  2. 不要为您的对象编写匹配器,有一些工具可以为您完成此操作(例如 shazamcrest)。