【发布时间】:2015-07-20 18:31:02
【问题描述】:
我有一个需要检查嵌套映射值的单元测试。我可以通过拉出条目并匹配底层Map 来使我的断言起作用,但我正在寻找一种清晰的方法来显示断言正在做什么。这是一个非常简化的测试:
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)。我不确定如何强制断言使用第二种形式。
提前致谢。
【问题讨论】:
-
"似乎问题是正在使用 ..." 比较外部地图。例如,
hasEntry(is("key"), is("value"))会导致使用第二种形式。也许您可以使用equalTo匹配器代替is,但无论哪种方式,可读性都超出了窗口。 -
问题出在外部测试上,所以我需要
equalTo("nested")...之类的东西,但除非我将外部地图类型更改为Map<String, Map<String,Object>>