在使用hasItem Hamcrest Matcher时出现“未找到适当的方法”的错误。

4
当我运行以下jUnit测试时:
@Test
public void test(){
    List<Map<String,String>> data=new ArrayList<>();
    Map<String,String> map=new HashMap<>();
    map.put("x","y");
    data.add(map);

    assertThat(data, hasItem(hasKey("x")));
}

我得到了这个:
错误:(239, 9) java: 找不到适合的方法assertThat(java.util.List<T>, org.hamcrest.Matcher<? super T>)
    方法org.junit.Assert.assertThat(java.lang.String, T, org.hamcrest.Matcher)不适用
      (无法推断类型变量T
        (实际参数列表和形式参数列表长度不同))
    方法org.junit.Assert.assertThat(T, org.hamcrest.Matcher)不适用
      (推断出的类型不符合上界(s)
        推断出的类型: java.util.List<T>
        上界(s): java.lang.Iterable<? extends java.lang.Object>,java.lang.Object)
看起来泛型中的某些东西出了问题。是什么问题?

一个关于测试的问题,每个安卓程序员都应该问,只有3个赞?我为这个行业感到羞耻!每个人都应该更多地教授测试! - Phlip
2个回答

2

javac 不知道如何为其中某些方法推断泛型类型。

assertThat 需要一个值和该类型的 Matcher。您必须明确指定。

Assert.assertThat(data, Matchers.<Map<String, String>> hasItem(Matchers.hasKey("x")));

尽管在Java8中不需要明确的类型参数,但这应该能够正常工作。

0

我认为他们更新了函数的签名。我发现我正在使用旧语法。

旧的 assertThat(singleParam)

assertThat(res.getStatus()).isEqualTo(200);

新的assertThat(actual, expected)

assertThat(res.getEntity(), is("Testing"));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接