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 范围的东西,你必须放下那个演员。
我有一个 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 范围的东西,你必须放下那个演员。