【问题标题】:How to assert that all elements in the collection have a property which is equal among them?如何断言集合中的所有元素都具有它们之间相等的属性?
【发布时间】:2016-10-18 10:18:12
【问题描述】:

我有一个对象集合(比如说Cars)。每辆车都有一个Company 类型的属性,可以通过其id 来识别。

现在我想断言我收藏中的所有汽车都属于同一家公司,即每辆汽车的公司都与其他公司相同。

请注意,在我的测试中我事先并不知道公司 ID 的值。我不在乎价值,唯一重要的是它在所有汽车中都是一样的。

我会想象这样的事情:

assertThat(allCars, Matchers.equalAmongAll(hasProperty("company", hasProperty("id"))));

编辑:只有 Java 7 可用,不能使用 Java 8 表达式

【问题讨论】:

  • 为什么不简单地遍历allCars 集合?
  • 当然这是一个选项,但它有点笨拙(尤其是在更深一层时),我想知道使用 Hamcrest 提供的 fluent API 是否有更优雅的方式。
  • UnitTest 的第二个最重要的事情是(在可读性之后)它们由于正确的原因而失败。手工制作的 Matcher 可能会增强可读性,但会在意外情况下导致失败,这将是失败的错误原因...

标签: java testing junit hamcrest


【解决方案1】:

我不确定我是否理解你,可能是这样的:

int id = allCars.get(0).getId();
List<Car> list = allCars.stream().filter(c -> c.getId() == id).collect(Collectors.toList());
assertEquals(list.size(), allCars.size());

【讨论】:

  • 我需要另一个电话来检查公司映射allCars.stream().map(car -&gt; car.getCompany()).filter(com -&gt; com.getId() .... 但不幸的是我不能使用 Java,8 只能使用 Java 7,抱歉应该在问题中提到它。
  • 但您可以使用相同的模式:循环原始列表,将所有匹配的汽车收集到一个新列表中,然后比较两个列表...
  • 如果您的代码中有 guava lib,您可以将其用于您的目的。如果没有 - 使用旧式 for 循环不会有任何麻烦。
猜你喜欢
  • 2023-03-04
  • 1970-01-01
  • 2016-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多