【问题标题】:Hamcrest's lessThan doesn't compileHamcrest 的 lessThan 无法编译
【发布时间】:2010-12-21 17:32:37
【问题描述】:

试图编译这段代码

import static org.hamcrest.Matchers.is;
import static org.hamcrest.number.OrderingComparison.lessThan;

...

Assert.assertThat(0, is(lessThan(1)));

发出此编译错误:

assertThat(Object, org.hamcrest.Matcher<java.lang.Object>) 不能应用于(int, org.hamcrest.Matcher<capture<? super java.lang.Integer>>)

这可能是不同 hamcrest 版本之间的冲突吗? 我正在使用 jUnit 4.6 和 hamcrest 1.3

【问题讨论】:

  • 只有一份 hamcrest 不会有冲突。你有哪些版本的 JUnit 和 Hamcrest?请记住,更高版本的 JUnit 包含他们自己的 Hamcrest 位副本。
  • 我最近添加了 hamcrest,之前只使用了 jUnit。与 jUnit 捆绑的 hamcrest 可能较旧,应该更新。

标签: java unit-testing junit hamcrest


【解决方案1】:

我认为问题在于 JUnit 与较旧的 Hamcrest (1.1) 副本捆绑在一起,因为较新版本的 Hamcrest 中的签名与 JUnit 不兼容。有两种可能的解决方案:

  1. 从类路径中删除您的 Hamcrest (1.3) 版本,并使用与 JUnit 捆绑的副本。
  2. 使用不包含 Hamcrest 的不同版本的 JUnit(我相信这些 jar 的名称类似于“junit-dep-xxx.jar”)
  3. org.junit.Assert.assertThat() 的调用更改为 org.hamcrest.MatcherAssert.assertThat()`。

后者可能是我推荐的选项,因为 assertThat() 的 Hamcrest 版本会产生更好的失败消息,而 1.1 之后的版本有一些不错的功能(例如 TypeSafeDiagnosingMatcher)。

【讨论】:

    【解决方案2】:

    我不使用 Hamcrest,但显然 int 不是对象。请改用Integer,例如

    Assert.assertThat(Integer.valueOf(0), is(lessThan(1)));
    

    我想您使用的是 Java 版本 Integer。

    【讨论】:

    • Java 1.6,向 Integer 添加强制转换并不能解决任何问题。哦,感谢您对一个合法问题的否决(假设是你,如果不是我收回)。
    • 我不认为有人提供了答案并否决了这个问题。估计是别人。向我 +1,只是因为我也不理解未评论的反对票。
    • 我刚刚尝试过使用 JDK 6、hamcrest-all-1.2.jar 和 junit-4.7.jar,它编译得很好。注意使用org.junit.Assert,而不是junit.framework.Assert。并且要小心侮辱那些只是想帮助你的人,即使他们投了反对票(我没有)。
    • 抱歉我的错误假设 - 我会确保我使用的是正确的 Assert。无论如何,它们之间有什么区别 - 为什么它们都在类路径中?
    • 不确定,但很可能是为了 JUnit 3 向后兼容。
    【解决方案3】:

    我认为问题可能出在您的 assertThat 方法上。如果它说,

    void assertThat(Object item, Matcher<Object> matcher) { ... }
    

    那你需要改成:

    void <T> assertThat(T item, Matcher<? super T> matcher) { ... }
    

    与您的 Hamcrest 库相比,您的 JUnit 库可能已经过时了?你是自己建造的吗?您的类路径中是否可能有多个 JUnit 或 Hamcrest 副本?

    【讨论】:

      【解决方案4】:

      这是一个非常奇怪的问题。我认为我们需要更多信息,因为它应该可以正常工作。我尝试使用 JUnit 4.4 和 Hamcrest 1.1(有点旧,但这是我在当前项目中使用的,因此很容易测试)来重现它,并且效果很好。

      我注意到的唯一区别是我的 Eclipse 导入了 org.hamcrest.Matchers.lessThan 而不是 org.hamcrest.number.OrderingComparisons.lessThan,但是当我使用后者时,它也能完美运行。

      这可能是由于您使用的是旧版本的 Hamcrest 或 JUnit(您实际使用的是哪个版本?您还没有提到它)。奇怪的是,即使您向Integer 添加了显式强制转换,您也会遇到错误。这很有趣,当您发布此错误时它可能会有所帮助......

      无论如何,它应该可以完美运行,因为没有语法错误或其他问题,因此您的设置必须是问题的原因。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-09
        • 1970-01-01
        • 2019-10-11
        • 1970-01-01
        • 2015-11-25
        • 2015-06-07
        相关资源
        最近更新 更多