【问题标题】:Preventing usage of Hamcrest with JUnit 4.x防止在 JUnit 4.x 中使用 Hamcrest
【发布时间】:2020-01-31 08:49:00
【问题描述】:

我目前正在使用带有 AssertJ 的 JUnit 4.x。我想确保没有使用 Hamcrest 偷偷摸摸。但是,Hamcrest Core 是 JUnit 在运行时必需的依赖项,请参阅 Junit issue #1429: A Exception for junit4.12 about org/hamcrest/SelfDescribing #1429 ,因此直接从 pom.xml 中排除依赖项或调整 maven-surefire-plugin 类路径将不起作用。

我正在寻找的是一种调整测试编译器类路径的方法,但是我在maven-compiler-plugin中没有找到这样的选项。

如何确保我的测试不使用 Hamcrest 断言?我想在构建时使用 Maven 强制执行此操作。

【问题讨论】:

    标签: java maven junit hamcrest assertj


    【解决方案1】:

    基于你不能从 JUnit 4 中排除 Hamcrest 的传递依赖,因为它被 JUnit 本身使用,所以只有几个选项:

    • 迁移到 JUnit Jupiter(又名 JUnit 5)并完全删除 hamcrest 并通过 maven-enforcer-rule 禁止依赖
    • 使用Arch Unit 防止使用
    • 创建 SonarQube 规则
    • 正如 Robert 已经建议的 Checkstyle 规则..
    • 您还可以考虑编写自定义实施规则吗?
    • 另一种选择是使用JQAssistant

    【讨论】:

      【解决方案2】:

      Maven 缺少范围。它有test,但它同时用于测试编译和测试运行时。理想情况下,您会将 hamcrest 的范围设置为测试运行时。 JUnit 5 已经明确 Maven 缺少这个范围,但是很难引入新的范围。

      所以我认为最好的选择是 Checkstyle Rule IllegalType 或类似的规则来防止它。

      【讨论】:

      • 测试运行时是否不允许在您的测试代码中使用 Hamcrest?如果我正确理解它不会解决问题。也许我们应该考虑一个强制规则来检查代码中的导入?
      • 假设您可以将 hamcrest 的范围更改为不存在的测试运行时,那么在编译测试时它不会在类路径中。因此,如果您使用 hamcrest 类,构建将失败。我不喜欢强制规则的想法,因为您需要分析(源)代码。已经有框架可以做到这一点,我们不要重新发明轮子。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-16
      • 2021-02-03
      • 2015-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多