acv*_*vcu 9 java junit unit-testing hamcrest
假设我有一张地图:
Map<String,Object> map1 = new HashMap<String,Object>();
map1.put("foo1","foo1");
map1.put("foo2", Arrays.asList("foo2","bar2"));
Run Code Online (Sandbox Code Playgroud)
现在我想使用Hamcrest匹配器来验证Map的值.如果这是一个Map <String,String>我会做类似的事情:
assertThat(map1, hasEntry("foo1", "foo1"));
Run Code Online (Sandbox Code Playgroud)
但是,我试图在Map中使用它时遇到困难,Map中的条目可能是String或值列表.这适用于第一个条目:
assertThat(map1, hasEntry("foo1", (Object)"foo1"));
Run Code Online (Sandbox Code Playgroud)
对于第二个条目,我无法弄清楚如何设置Matchers.
编辑:
我也尝试了这个,但它会产生编译器警告.
assertThat(
map1,
hasEntry(
"foo2",
contains(hasProperty("name", is("foo2")),
hasProperty("name", is("bar2")))));
Run Code Online (Sandbox Code Playgroud)
"Assert类型中的方法assertThat(T,Matcher)不适用于参数(Map,Matcher >>>)"
(以上是解决方案:Hamcrest比较收藏)
你不能用Hamcrest优雅地做到这一点,hasEntry因为当你尝试在列表上使用匹配器时它会进行类型检查.我认为最简单的选择是做这样的事情:
@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;
}
Run Code Online (Sandbox Code Playgroud)
hasListEntry这里只是为了防止编译错误.它确实是未经检查的分配,这就是你需要@SuppressWarnings("未选中")的原因.例如,您可以将此静态方法放在常用的测试工具中.
| 归档时间: |
|
| 查看次数: |
6352 次 |
| 最近记录: |