junit - 如何使用Hamcrest检查 map 项

标签 junit hamcrest

我最近一直在使用Hamcrest库编写一些测试,并且相当成功,但是现在我需要做一些更复杂的事情,并开始看到很多困难。我需要检查并验证Map中各项的属性。我的生产代码如下所示:

    Map<String, List<MyItem>> map = new HashMap<String, List<MyItem>>();
    map.put("one", Arrays.asList(new MyItem("One")));
    map.put("two",  Arrays.asList(new MyItem("Two")));
    map.put("three",  Arrays.asList(new MyItem("Three")));

我想编写一些类似于以下的测试代码,但无法编译。看起来Hamcrest的hasEntry是类型参数化的,而hasItem和hasProperty只需要Object。
    assertThat(map, Matchers.<String, List<MyItem>>hasEntry("one",  hasItem(hasProperty("name", is("One")))));

我的IDE(Eclipse)给出此错误消息:类型为<String, List<HamcrestTest.MyItem>>hasEntry(String, List<HamcrestTest.MyItem>)的参数化方法Matchers不适用于参数(String, Matcher<Iterable<? super Object>>)。一方面,我认为Eclipse对我想使用的hasEntry方法感到困惑,它应该是hasEntry(org.hamcrest.Matcher<? super K> keyMatcher, org.hamcrest.Matcher<? super V> valueMatcher)而不是hasEntry(K key, V value)

我应该放弃并从 map 上获取商品并手动检查每个属性吗?有没有更清洁的方法?

最佳答案

Youu可以只使用containscontainsInAnyOrder。没错,您必须以这种方式列出List中的所有项目,但它比hasItem更干净:

@SuppressWarnings("unchecked")
@Test
public void mapTest() {
  Map<String, List<MyItem>> map = new HashMap<String, List<MyItem>>();
  map.put("one", asList(new MyItem("1"), new MyItem("one")));

  assertThat(map, hasEntry(is("one"),
                           containsInAnyOrder(hasProperty("name", is("one")),
                                              hasProperty("name", is("1")))));
}

关于junit - 如何使用Hamcrest检查 map 项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20197783/

相关文章:

hibernate - 如何在 JUnit 测试中初始化 EJB 的 EntityManager?

JUnit - java.lang.NoClassDefFoundError : org/hamcrest/SelfDescribing

java - org.hamcrest.Matchers.any 在 java 8 中不工作

java - Mockito's Matcher vs Hamcrest Matcher?

java - 比较 hamcrest 中的子字段

java - JUnit 失败但没有测试报告失败

kotlin - 传递给when() 的参数不是模拟!正确 stub 的示例 : doThrow(new RuntimeException()). when(mock).someMethod();

java - 包含 native 方法的类的 JUnit

java - JUnit Matcher#startsWith 的声明在哪里?

java - 无法使用 play 框架运行 Junit 测试