确定两个列表相等,而不关心订购 Mockito



我遇到了这样一种情况:我正在通过 when-then 来匹配列表,但由于排序问题,我大多数时候都遇到错误。

List<String> myListToMatch = new ArrayList<String>();
myListToMatch .add("1");
myListToMatch .add("2");
when(obj.methodName(eq(myListToMatch))).thenReturn("someStringValue");

由于在调用方法中的排序,列表变为 ["2","1"],它没有按照上述存根返回"someStringValue",这影响了我的测试用例。 任何帮助,不胜感激。我正在使用Mockito库。我没有任何Hamcrest依赖(不想添加任何(。

我尝试在代码中排序并且它可以工作,但如果有方法或某种参数匹配器可以在 when-then stubing 中使用,我不想更新我的代码。

首先,如果你不关心元素的顺序,你可以选择集合。或者,您也可以遵循以下答案中给出的与您的问题陈述密切相关的实现。

如果您使用的是Java 8和更新版本的Mockito,则可以编写以下代码段。它取自这里

when(
   mock.method(argThat(t -> t.containsAll(Arrays.asList("1","2"))))
).thenReturn(myValue);

如果这回答了您的问题,请告诉我。

假设您实际上关心出现次数,最简单的方法是构造一个Map<String, Long>,其中键是列表中的元素,值是该元素的出现次数:

Map<String, Long> map =
    list.stream()
        .collect(Collectors.groupingBy(a -> a, Collectors.counting()));

为每个预期列表和实际列表构建此映射,然后比较它们的相等性。

相关内容

  • 没有找到相关文章

最新更新