当前位置: 首页 > 知识库问答 >
问题:

如何使用Hamcrest检查地图项目

易元青
2023-03-14

我最近一直在使用Hamcrest库编写一些测试,非常成功,但现在我需要做一些更复杂的事情,并开始看到很多困难。我需要输入并验证地图中项目的属性。我的生产代码如下所示:

    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)给出了这个错误消息:参数化方法

我应该放弃并从地图上获取物品,然后手动检查每个属性吗?有没有更干净的方法?


共有3个答案

钮誉
2023-03-14

由于@t0mppa没有提供一个很好的例子来说明如何使用Hamcrest的包含包含InAnyOrder,这里有一点东西可以让你开始:

Map<Integer, String> columns = new HashMap<Integer, String>();
columns.put(1, "ID");
columns.put(2, "Title");
columns.put(3, "Description");

assertThat(columns.values(), contains("ID", "Title", "Description")); // passes
assertThat(columns.values(), contains("ID", "Description", "Title")); // fails
assertThat(columns.values(), containsInAnyOrder("ID", "Description", "Title")); // passes

请注意,与hasItemhasItem相反,只有当您向它们提供将匹配的所有值的完整列表时,它们才会起作用。有关更多信息,请参阅Hamcrest的javadocs。

蒋鸿文
2023-03-14

所以为了让这更简单,你可以试试这个。。。

assertThat((Object)map, (Matcher)Matchers.hasEntry("one",  hasItem(hasProperty("name", is("One")))));

通过转到原始类型,您将得到一个警告,但没有编译错误。如果在过去使用这个技巧时,我不想担心所有的铸造都适合编译器。

此外,您可以考虑使用ItIterableContainingInOrder.containingInOrder(new MyItem(One))。这将验证整个列表,如果MyItem实现了等于,那么您将不会在测试中使用反射。

颛孙庆
2023-03-14

你可以只使用包含或包含。的确,您必须以这种方式列出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")))));
}
 类似资料:
  • 问题内容: 如果给定的集合中包含给定顺序的给定项目,如何使用Hamcrest进行检查?我尝试过,但是它只是忽略了顺序。 问题答案: 您可以改用匹配器,但可能需要使用最新版本的Hamcrest。该方法检查顺序。 如果订单对您来说没有关系,您也可以尝试使用。 这是匹配器的代码:

  • 我写了Spring控制器Junits。我使用JsonPath通过< code>["$..id"]。 我有以下作为测试方法: 以下是我传递的数据:- 我收到的失败消息如下:- 问题是:如何使用<code>org.hamcrest处理JSONArray。匹配器 是否有任何简单的方法来使用jsonPath。 设置:-,,

  • 我正在使用Jfreechart构建和显示图表。我想知道,似乎没有一种标准的方法,来检查创建的图表的类型(例如,条形图,散点图等)。目前,我正在检查基础图以获得图表类型,但我相信这个选项是有限的,当比较散点图和折线图。有没有更好的方法,在创建图表之后,改变图表的类型? 编辑:基本上我想在图表上应用数据。我使用了不同的图表(比如ScatterChart和XYLineChart)。我有一个方法,应该应用

  • 我一直在研究这三个网站,了解如何使用log4j2创建地图查找(或任何其他查找): http://logging.apache.org/log4j/2.x/manual/extending.html#Lookups http://logging.apache.org/log4j/2.x/manual/lookups.html http://logging.apache.org/log4j/2.x/m

  • 问题内容: 我有一个的关键无非是像“123”等我得到的数值,因为这个数值是从UI在我的JSF组件来数值。我不想更改UI组件的合同。 现在,我想基于上面创建一个,我在类中看到了一些方法,但是所有方法都集中在转换值而不是键上。 有没有更好的转换方法? 问题答案: Java 8的更新 您可以使用流来执行此操作: 假定所有键都是s的有效字符串表示形式。另外,转换时可能会发生冲突;例如,与两个地图。 我认为

  • 我正在使用Glide从URL将图像加载到图像视图中。如何在此图像视图上执行比较操作以检查是否确实使用Espresso加载了正确的URL?我在回收器视图中有许多这样的图像,并且正在滚动到它的每个项目,如下所示: 但是在这个循环中,我如何检查图像视图内容? 谢谢