我有一个单元测试需要检查一个嵌套地图的值。 我可以通过取出该条目并匹配底层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)
进行了外部 Map 的比较,但我想使用的是 hasEntry(Matcher<? super K> keyMatcher, Matcher<? super V> valueMatcher)
。我不确定如何强制断言使用第二种形式。提前感谢。
hasEntry(is("key"), is("value"))
比较外部映射表,例如会导致使用第二种形式。也许你可以使用equalTo
匹配器代替is
,但无论哪种方式,可读性都会大打折扣。 - mystarrocksequalTo("nested")...
这样的东西,但是如果我不将外部映射类型更改为Map<String, Map<String,Object>>
,这是行不通的。 - Jeff E