Java 如何断言集合中的所有元素都有一个在它们之间相等的属性?

Java 如何断言集合中的所有元素都有一个在它们之间相等的属性?,java,testing,junit,hamcrest,Java,Testing,Junit,Hamcrest,我有一组对象(比如说Cars)。每辆车都有一个类型为Company的属性,可以通过其id来识别 现在我想断言,我收藏的所有汽车都属于同一家公司,即每辆汽车的公司与其他所有汽车的公司相等 注意,在我的测试中,我事先不知道公司ID的值。我不在乎它的价值,唯一重要的是它在所有汽车中都是一样的 我会想象这样的情况: assertThat(allCars,Matchers.equalAmongAll(hasProperty(“公司”),hasProperty(“id”)) 编辑:只有Java 7可用,不能

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

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

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

我会想象这样的情况:

assertThat(allCars,Matchers.equalAmongAll(hasProperty(“公司”),hasProperty(“id”))


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

我不确定我是否理解您的意思,可能是这样的:

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

为什么不简单地循环使用
allCars
集合呢?当然这是一个选项,但它有点笨拙(特别是在更深一层时),我想知道是否有更优雅的方式使用Hamcrest提供的fluent API。UnitTest的第二个最重要的事情是(在可读性之后)他们失败的原因是正确的。手工制作的匹配器可能会增强可读性,但在意外情况下会导致失败,这可能是失败的错误原因…我需要另一个调用来检查公司映射
allCars.stream().map(car->car.getCompany()).filter(com->com.getId())..
但不幸的是,我不能使用Java,8只是Java 7,对不起,我应该在问题中提到它。但是你可以使用相同的模式:循环原始列表,收集新列表中所有匹配的汽车,并比较两个列表…如果你的代码中有番石榴酱,你可以使用它。如果没有,就没有问题了它与旧样式的循环。