我遇到了一种情况,我在通过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存根中使用,我不想更新代码。
答案 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()));
为每个预期列表和实际列表构建此映射,然后比较它们是否相等。