首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何断言Map包含带有条目的Map

如何断言Map包含带有条目的Map
EN

Stack Overflow用户
提问于 2015-07-21 02:31:02
回答 4查看 33.6K关注 0票数 13

我有一个需要检查嵌套映射值的单元测试。我可以通过提取条目并匹配底层Map来使断言工作,但我正在寻找一种清晰的方法来显示断言正在做什么。下面是一个非常简单的测试:

代码语言:javascript
复制
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.hasEntry;

import java.util.HashMap;
import java.util.Map;

import org.junit.Test;

public class MapContainsMapTest {
    @Test
    public void testMapHasMap() {
        Map<String, Object> outerMap = new HashMap<String, Object>();
        Map<String, Object> nestedMap = new HashMap<String, Object>();
        nestedMap.put("foo", "bar");
        outerMap.put("nested", nestedMap);

        // works but murky
        assertThat((Map<String, Object>) outerMap.get("nested"), hasEntry("foo", "bar"));
        // fails but clear
        assertThat(outerMap, hasEntry("nested", hasEntry("foo", "bar")));
    }
}

似乎问题是使用hasEntry(K key, V value)比较外部映射,而我想使用的是hasEntry(Matcher<? super K> keyMatcher, Matcher<? super V> valueMatcher)。我不确定如何强制断言使用第二种形式。

提前谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-07-21 02:46:09

我可能会为此扩展一个新的Matcher,就像这样(注意,NPE潜伏):

代码语言:javascript
复制
class SubMapMatcher extends BaseMatcher<Map<?,?>> {

private Object key;
private Object subMapKey;
private Object subMapValue;

public SubMapMatcher(Object key, Object subMapKey, Object subMapValue) {
    super();
    this.key = key;
    this.subMapKey = subMapKey;
    this.subMapValue = subMapValue;
}

@Override
public boolean matches(Object item) {

    Map<?,?> map = (Map<?,?>)item;

    if (!map.containsKey(key)) {
        return false;
    }

    Object o = map.get(key);

    if (!(o instanceof Map<?,?>)) {
        return false;
    }

    Map<?,?> subMap = (Map<?,?>)o;
    return subMap.containsKey(subMapKey) && subMap.get(subMapKey).equals(subMapValue);
}

@Override
public void describeTo(Description description) {
    description.appendText(String.format("contains %s -> %s : %s", key, subMapKey, subMapValue));
}

public static SubMapMatcher containsSubMapWithKeyValue(String key, String subMapKey, String subMapValue) {
    return new SubMapMatcher(key, subMapKey, subMapValue);
}

}
票数 4
EN

Stack Overflow用户

发布于 2015-07-21 13:40:55

如果您只想将Map<String, Object>作为值放入outerMap中,请相应地调整声明。然后你可以这样做

代码语言:javascript
复制
@Test
public void testMapHasMap() {
    Map<String, Map<String, Object>> outerMap = new HashMap<>();
    Map<String, Object> nestedMap = new HashMap<String, Object>();
    nestedMap.put("foo", "bar");
    outerMap.put("nested", nestedMap);

    Object value = "bar";
    assertThat(outerMap, hasEntry(equalTo("nested"), hasEntry("foo", value)));  
}

出于编译的原因,Object value = "bar";是必需的。或者,您可以使用

代码语言:javascript
复制
assertThat(outerMap,
   hasEntry(equalTo("nested"), Matchers.<String, Object> hasEntry("foo", "bar")));
票数 5
EN

Stack Overflow用户

发布于 2015-07-21 03:14:07

如果将outerMap声明为Map<String, Map<String, Object>>,则不需要丑陋的类型转换。如下所示:

代码语言:javascript
复制
public class MapContainsMapTest {

    @Test
    public void testMapHasMap() {
        Map<String, Map<String, Object>> outerMap = new HashMap<>();
        Map<String, Object> nestedMap = new HashMap<>();
        nestedMap.put("foo", "bar");
        outerMap.put("nested", nestedMap);

        assertThat(outerMap.get("nested"), hasEntry("foo", "bar"));
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31523800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档