Hamcrest's lessThan不编译

时间:2009-11-30 17:38:55

标签: java unit-testing junit hamcrest

尝试编译此代码

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

4 个答案:

答案 0 :(得分:5)

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

  1. 从类路径中删除您的Hamcrest(1.3)版本,并使用与JUnit捆绑在一起的副本。
  2. 使用JUnit的不同发行版本(我相信这些jar被命名为'junit-dep-xxx.jar),不包括Hamcrest
  3. org.junit.Assert.assertThat()的调用更改为org.hamcrest.MatcherAssert.assertThat()`。
  4. 后者可能是我推荐的选项,因为Hamcrest版本的assertThat()会产生更好的失败消息,而1.1之后的版本会有一些不错的功能(例如TypeSafeDiagnosingMatcher)。

答案 1 :(得分:1)

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

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

我想您使用的是Java版本&lt; = 1.4,其中自动装箱不起作用。因此,您需要首先明确转换为Integer

答案 2 :(得分:1)

我想也许问题是你的断言那个方法。如果它说,

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

然后您需要将其更改为:

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

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

答案 3 :(得分:0)

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

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

这可能是因为您使用旧版本的Hamcrest或JUnit(您实际使用哪些版本?您还没有提到它)。奇怪的是,即使您向Integer添加了显式转换,您也会收到错误。这很有意思,当你发布这个错误时它会很有用......

无论如何,它应该可以正常工作,因为没有语法错误或其他东西,所以你的设置必须是问题的原因。