当前位置: 首页 > 知识库问答 >
问题:

使用hamcrest匹配Map包含不同类型的条目

牛昱
2023-03-14

假设我有一张地图:

Map<String,Object> map1 = new HashMap<String,Object>();
map1.put("foo1","foo1");
map1.put("foo2", Arrays.asList("foo2","bar2"));
assertThat(map1, hasEntry("foo1", "foo1"));
assertThat(map1, hasEntry("foo1", (Object)"foo1"));
assertThat(
            map1,
            hasEntry(
                    "foo2",
                    contains(hasProperty("name", is("foo2")),
                            hasProperty("name", is("bar2")))));

“Assert类型中的方法assertThat(T,Matcher)不适用于参数(Map,Matcher>>>)”

(以上是这里的解决方案:Hamcrest比较集合)

共有1个答案

令狐辉
2023-03-14

您不能用Hamcresthasentry优雅地完成这一任务,因为当您尝试在列表上使用匹配器时,它将执行类型检查。我认为最简单的选择是这样做:

@Test
public void test() {
    Map<String, Object> map1 = new HashMap<>();
    map1.put("foo1", "foo1");
    map1.put("foo2", Arrays.asList("foo2", "bar2"));

    assertThat(map1, hasEntry("foo1", "foo1"));
    assertThat(map1, hasListEntry(is("foo2"), containsInAnyOrder("foo2", "bar2")));
}

@SuppressWarnings("unchecked")
public static org.hamcrest.Matcher<java.util.Map<String, Object>> hasListEntry(org.hamcrest.Matcher<String> keyMatcher, org.hamcrest.Matcher<java.lang.Iterable<?>> valueMatcher) {
    Matcher mapMatcher = org.hamcrest.collection.IsMapContaining.<String, List<?>>hasEntry(keyMatcher, valueMatcher);
    return mapMatcher;
}

HasListEntry在这里只是为了防止编译器错误。它执行未经检查的赋值,这就是为什么需要@suppresswarnings(“unchecked”)。例如,您可以将此静态方法放在公共测试util中。

 类似资料:
  • 我试图使用org.hamcrest.matchers.contains(java.util.list >),但是编译器告诉我它无法解析该方法。 我甚至尝试了Hamcrest在这里给出的示例,但得到了相同的编译错误: 但随后我得到了另一个编译错误: 有没有办法恰当地使用这种方法?

  • 问题内容: 我正在创建单词表示该句子的包。然后将句子中存在的单词与文件“ vectors.txt”进行比较,以获取其嵌入矢量。在获取句子中每个单词的向量之后,我将句子中单词的向量取平均值。这是我的代码: 不知道为什么,但是我得到这个错误: PS嵌入向量如下所示: 使用np.sum后,出现此错误: 问题答案: 您有一个numpy的字符串数组,而不是浮点数。这就是一个小端编码的unicode字符串,最

  • 问题所在 我目前正在尝试使用Hamcrest匹配器来断言返回的列表类型是特定类型。例如,假设我的服务调用返回了以下列表: null 使用Hamcrest匹配器,是否有一种方法可以断言空列表是某种类型的参数化的(例如)?

  • 对于类; 我正在构建这样的自定义Matcher; 检查列表是否包含

  • 我有两个对象集合。这两个集合中的对象是不同类型的,并且有一个自定义匹配器来检查它们是否引用相同的东西。此外,集合的顺序相同。比方说,我们可以按名称比较这些集合中的实体,它们按该名称排序,我们有一个自定义匹配器,如果名称相同,则返回true。 我需要的是一个匹配器,它将逐项迭代这两个集合,并使用现有的自定义匹配器比较这些对(我也可以修改它)。 有人知道怎么做吗? 我的意思是:

  • 我想基于泛型值返回不同的类型。例如: 但我有一个错误: 类型字符串[]不能分配给类型T扩展Base?String[]:字符串