【问题标题】:NoSuchMethodError when using assertThat+is with data type short使用带有短数据类型的 assertThat+is 时出现 NoSuchMethodError
【发布时间】:2018-05-11 11:41:26
【问题描述】:

我有一堂课,有一个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));

那是怎么回事? ????

【问题讨论】:

  • 你的order.status 是短类型的吗?
  • @Cargeh 正如问题的第一行所述,是的。 ??????
  • @GhostCat 但是当 Java 中没有任何 short 文字时,它不应该工作吗? is 不应该去“好吧,我们这里有一个short 和一个int,我知道该怎么做”?除此之外,在我看来,这个问题是最小的、完整的和可验证的......
  • 至于重复,那个问题没有回答我的问题。它回答了为什么 Java 中没有短文字。我的问题是为什么 assertThatis 然后关心 short 和 int 之间的区别,而 Java 显然没有区别。

标签: java junit4 hamcrest


【解决方案1】:

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

T 在你的情况下是:short

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

虽然将 0-int 转换为 0-short 完全没问题,但 Java 还不够聪明。当您将某些东西从 int 范围“限制”到 short 范围时,您必须放下该演员表。

【讨论】:

  • Java 不够聪明...我在使用 Java 时总是缺少 C# ?
猜你喜欢
  • 1970-01-01
  • 2020-11-03
  • 2016-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多