Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何断言集合中的所有值都具有特定属性_Java_Sonarqube_Mockito - Fatal编程技术网

Java 如何断言集合中的所有值都具有特定属性

Java 如何断言集合中的所有值都具有特定属性,java,sonarqube,mockito,Java,Sonarqube,Mockito,目前我正在这样做 while (permissions.hasNext()) { assertEquals(permissions.next().getRole(), "everybody"); } 这很好,但是有更好的方法吗 问这个问题是因为Sonar目前显示了一个违规,说“在这个测试用例中添加至少一个断言。”我相信它无法读取循环中的断言。这是声纳中的一个bug吗?您可以使用包含的,例如: assertTrue(yourCollection.contains("permissions")

目前我正在这样做

while (permissions.hasNext()) {
  assertEquals(permissions.next().getRole(), "everybody");
}
这很好,但是有更好的方法吗


问这个问题是因为Sonar目前显示了一个违规,说“在这个测试用例中添加至少一个断言。”我相信它无法读取循环中的断言。这是声纳中的一个bug吗?

您可以使用
包含的
,例如:

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

Javadoc。

您可以使用
包含
,例如:

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

Javadoc。

您可以使用Java 8流:

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

您可以使用Java 8流:

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

另一个非常有表现力的解决方案(与往常一样)-assertThat+matchers:

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

(我个人有点不喜欢使用反射将“role”转换为对getRole()的调用)。请参阅以进一步阅读。

另一个非常有表现力的解决方案(与往常一样)-assertThat+matchers:

assertThat(yourCollection, everyItem(hasProperty("role", "everybody)));
(我个人有点不喜欢使用反射将“role”转换为对getRole()的调用)。有关详细信息,请参阅。

使用以下方法的解决方案:

或者,如果您不喜欢使用反射提取值,则可以使用流:

assertThat(permissions.stream().map(Permission::getRole)).containsOnly("everybody");
解决方案使用:

或者,如果您不喜欢使用反射提取值,则可以使用流:

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


如果您想检查集合至少有一个元素,那么您可以使用isEmpty()检查,还可以尝试使用它的索引检索元素,并检查断言猜测“向该测试用例添加至少一个断言”。当集合中没有任何元素时,会发生这种情况,所以hasNext()第一次返回false,并且不使用assertion@HristoVrigazov,但事实并非如此。hasNext()返回true,但Sonar仍在抱怨。如果要检查集合中至少有一个元素,则可以使用isEmpty()检查,还可以尝试使用其索引检索元素,并检查断言猜测“向此测试用例添加至少一个断言”。当集合中没有任何元素时,会发生这种情况,因此hasNext()第一次返回false,并且不使用assertion@HristoVrigazov,但事实并非如此。hasNext()返回为真,但Sonar仍在抱怨。这对问题有什么帮助,为什么会有两次投票?@qlown这是问题的内容:
我如何在集合中断言值
,答案就是这样解释的?标题很模糊,完整问题询问如何断言集合中的所有值都具有特定属性。您的回答显示了如何断言集合包含某个值,而该值没有被问到,甚至您引用的标题也没有问到。@qlown这实际上是一个更好的问题,我将更新该问题,使其不那么笼统和模糊。这对问题有何帮助,为什么会有两次投票?@qlown这是问题的内容:
我如何在集合中断言值
,答案就是这样解释的?标题很模糊,完整的问题是如何断言集合中的所有值都具有特定属性。您的答案显示了如何断言集合包含某个特定值,而该值没有被询问,甚至您引用的标题也没有这样问。@qlown这实际上是一个更好的问题,我将只更新该问题,使其不那么泛化和模糊。是的,重命名
getRole
方法,此测试将逃避重构:-/Yep。。。我很惊讶hamcrest在这里没有其他东西可以提供。。。但是我今天太累了,不能做更多的研究。也许明天吧。谢谢@GhostCat,行得通。但是正如您和qlown所指出的,我对使用这个有点谨慎,因为如果有人更改了属性,并且没有找出测试用例的错误,测试用例可能会被忽略。@GhostCat知道这一点很有用,但在其他情况下可以派上用场,@arbit,我做了一些研究-找不到其他的“完全hamcrest”解决方案。这有点遗憾,因为我非常喜欢使用assertThat()是的,重命名
getRole
方法,这个测试逃过了重构:-/Yep…我很惊讶hamcrest在这里没有提供任何其他东西…但是我今天太累了,无法做更多的研究。也许明天吧。谢谢@GhostCat,这很有效。但是正如你和qlown指出的,我对使用这个测试有点谨慎,因为测试用例可能会如果有人更改了属性,并且没有找出测试用例的错误,则必须忽略它。@GhostCat知道这一点很有用,但在其他情况下可以派上用场@Arpit,我做了一些研究-找不到另一个“完全hamcrest”解决方案。这有点遗憾,因为我非常喜欢使用assertThat()。效果很好,Sonar对此也很满意!我想知道这是否是Sonar中的一个bug,它没有读取循环中的断言?效果很好,Sonar对此也很满意!我想知道这是否是Sonar中的一个bug,它没有读取循环中的断言?