NoSuchMethodError 当使用 assertThat+is 数据类型为 short 时

NoSuchMethodError when using assertThat+is with data type short

我有一个 class,有一个 public short status,测试中的这一行:

assertThat(order.status, is(0));

但是它给我以下错误:

java.lang.NoSuchMethodError: org.hamcrest.Matcher.describeMismatch(Ljava/lang/Object;Lorg/hamcrest/Description;)V

    at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:18)
    at org.junit.Assert.assertThat(Assert.java:956)
    at org.junit.Assert.assertThat(Assert.java:923)
    at com.example.OrderTest.testStuff(OrderTest.java:101)
    ...

但是,如果我执行以下更丑陋的操作,错误就会消失:

assertThat(order.status, is((short) 0));

这是怎么回事?

assertThat()的签名是assertThat(T actual, org.hamcrest.Matcher<T> matcher)

T 在你的情况下是:short

所以你需要 Matcher<Short>。但是 0 是 int 文字。所以你必须告诉编译器:使用那个 int 值作为 short.

虽然将 0-int 转换为 0-short 非常好,但 Java 还不够聪明。因为你是 "restricting" 从 int 范围到 short 范围的东西,你必须放下那个演员。