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

时间:2019-06-18 15:24:45

标签: java mockito matcher

我遇到了一种情况,我在通过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存根中使用,我不想更新代码。

2 个答案:

答案 0 :(得分:1)

首先,如果您不关心元素的顺序,则可以选择Set。另外,您也可以遵循以下answer中给出的与您的问题陈述非常吻合的实现。

如果您正在使用Java 8和更高版本的Mockito,则可以编写以下代码。它取自here

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

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

答案 1 :(得分:0)

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

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

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