我遇到了这样一种情况:我正在通过 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()));
为每个预期列表和实际列表构建此映射,然后比较它们的相等性。