如何断言集合中的所有值都具有某个属性

时间:2017-08-01 16:19:55

标签: java sonarqube mockito

目前我正在这样做

while (permissions.hasNext()) {
  assertEquals(permissions.next().getRole(), "everybody");
}

这很好用,但还有更好的方法吗?

问起这个问题,因为Sonar目前正在显示违规行为,并说“在此测试案例中至少添加一个断言”。我相信它无法读取循环内的断言。这是Sonar的一个错误吗?

4 个答案:

答案 0 :(得分:3)

您可以使用Java 8流:

assertTrue(permissions
.stream()
.allMatch(permission -> permission.getRole().equals("everybody")));

答案 1 :(得分:2)

另一个非常富有表现力的解决方案(像往常一样) - 断言+ hamcrest匹配:

assertThat(yourCollection, everyItem(hasProperty("role", "everybody)));

(我个人不喜欢反思将用于将#34;角色"变成对getRole()的调用。有关详细信息,请参阅here

答案 2 :(得分:1)

您可以使用contains,例如:

assertTrue(yourCollection.contains("permissions"));

Here's Javadoc。

答案 3 :(得分:1)

使用AssertJ的解决方案:

assertThat(permissions).extracting("role").containsOnly("everybody");

或者如果你不喜欢反射来提取值,你可以使用stream:

assertThat(permissions.stream().map(Permission::getRole)).containsOnly("everybody");