【问题标题】:How can I create reusable test code without creating circular dependencies?如何在不创建循环依赖项的情况下创建可重用的测试代码?
【发布时间】:2016-02-16 19:33:01
【问题描述】:

考虑两个项目。

  • mycompany-foo
  • mycompany-foo-tests

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

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

我通过简单地将匹配器添加到 mycompany-foo、删除“tests”项目并将包含匹配器的测试 jar 作为“test-jar”导出来解决了这个问题。

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

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

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

【问题讨论】:

  • 如果foo-tests 是一个“库”,那么它不应该依赖于foo。就那么简单。如果需要,那么创建库是没有意义的。
  • 为什么 mycompany-foo 应该依赖于 mycompany-foo-tests?
  • @LouisWasserman 我猜mycompany-foo-tests 包含mycompany-foo 编写实际测试所需的测试工具。
  • @JaroslawPawlak,这完全正确。这就是为什么今天他们生活在同一个项目中,而我只是让 maven 创建了一个 test-jar 作为辅助工件。不幸的是,我链接到的丁香错误描述了一种行为,其中它用自己的覆盖测试罐。这就是可能将项目分开的动机。我显然不想这样做。
  • 首先,听起来你的 clover 和你的构建管道有问题,而不是循环依赖。也许根本不值得使用三叶草?其次,我看不出为什么需要生成测试 jar。最后,我真的推荐使用 shazamcrest - 非常简单而强大的工具,您根本不需要编写任何自定义匹配器;)

标签: java maven hamcrest clover


【解决方案1】:
  1. 不要将生产代码及其测试/测试实用程序分离到单独的项目中。
  2. 不要为您的对象编写匹配器,有一些工具可以为您做到这一点(例如 shazamcrest)。

【讨论】:

  • 感谢您指出图书馆。我会研究一下它是否符合我的需求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-02
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 2012-05-26
  • 1970-01-01
  • 2019-01-27
相关资源
最近更新 更多