7

试图编译这段代码

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

4 回答 4

5

我认为问题在于 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() 的调用。

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

于 2010-11-01T12:57:01.107 回答
2

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

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

我想您使用的是 Java 版本 <= 1.4,其中自动装箱不起作用。因此,您需要显式转换为Integerfirst。

于 2009-11-30T17:49:22.847 回答
1

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

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

那么您需要将其更改为:

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

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

于 2009-12-02T15:54:06.310 回答
0

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

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

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

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

于 2009-12-02T10:11:08.263 回答