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

hamcrest:使用hamcrest在逻辑上比较自定义类的两个集合

从经略
2023-03-14

我有两个收藏

public class Dumb {
    private String id;

    //setters & getters
}

简明扼要地,

@Test
public void test() {
    Collection<Dumb> actual = new ArrayList<Dumb>();
    Dumb actualDumbOne = new Dumb();
    actualDumbOne.setId("1");
    Dumb actualDumbTwo = new Dumb();
    actualDumbTwo.setId("2");
    actual.add(actualDumbOne);
    actual.add(actualDumbTwo);

    Collection<Dumb> expected = new ArrayList<Dumb>();
    Dumb expectedDumbOne = new Dumb();
    expectedDumbOne.setId("1");
    Dumb expectedDumbTwo = new Dumb();
    expectedDumbTwo.setId("2");
    expected.add(expectedDumbOne);
    expected.add(expectedDumbTwo);

    assertThat(expected, containsInAnyOrder(actual));
}

它失败的原因是:

Expected: iterable over [<[Dumb@56114349, Dumb@46c28400]>] in any order
     but: Not matched: <Dumb@2d6abfc7>

重要提示:我无法更改Dumbcode,它是第三方类。重要提示:我需要比较Dumb。id等于Dumb。id

有什么想法吗?


共有1个答案

蒋泰
2023-03-14

如果你只需要比较一下哑巴。id成员,您可以将id提取到列表中并比较生成的id列表。

    List<String> actualIds = actual.stream().map(Dumb::getId).collect(Collectors.toList());
    List<String> expectedIds = expected.stream().map(Dumb::getId).collect(Collectors.toList());

    assertThat(expectedIds, containsInAnyOrder(actualIds.toArray()));
 类似资料:
  • 您能帮助我在使用方法时哪里出错了吗?

  • 但是想法 我该怎么写?

  • 我有两个对象集合。这两个集合中的对象是不同类型的,并且有一个自定义匹配器来检查它们是否引用相同的东西。此外,集合的顺序相同。比方说,我们可以按名称比较这些集合中的实体,它们按该名称排序,我们有一个自定义匹配器,如果名称相同,则返回true。 我需要的是一个匹配器,它将逐项迭代这两个集合,并使用现有的自定义匹配器比较这些对(我也可以修改它)。 有人知道怎么做吗? 我的意思是:

  • 有人能给我解释一下hamcrest是如何比较馆藏的,以及图书馆的不同方法是用来做什么的吗 我正在试图理解IsterableContainingAnyOrder#ContainingAnyOrder方法是如何工作的 ISiterableContainingAnyOrder类中有三个重载方法:

  • 我做错了什么,怎么修复?

  • 我有以下课程: 现在我想在下面的测试中使用Hamcrest Matcher(它只是一个简化的示例): 但我也犯了同样的错误。 我使用的是Hamcrest 1.3版