使用 Mockito 模拟方法行为时以任意顺序匹配 List

2022-09-02 03:04:34

我有一个使用Mockito的测试,它有一个非常奇怪的行为 :它在调试中工作,但在正常运行时失败。经过一些调查,我意识到这是因为我正在嘲笑方法行为,传递要匹配的元素列表。但是由于某种原因,列表中的顺序并不总是相同的,因此它不匹配,并且我希望我的模拟返回的内容不会返回,因为2个列表不是“相等的”

 when(mockStatusCalculatorService.calculateStatus(Arrays.asList(IN_PROGRESS, ABANDONNED,EXPIRED))).thenReturn(ConsolidatedStatus.EXPIRED);

在我的情况下,要匹配的元素的顺序并不重要。那么在配置模拟时如何指定呢?


答案 1

为较新版本的 Mockito 和 Java 8 添加答案

when(
   mock.method(argThat(t -> t.containsAll(Arrays.asList(IN_PROGRESS, ABANDONED, EXPIRED))))
).thenReturn(myValue);

答案 2

如果您在版本 2.1.0 之前有 Mockito:

使用Hamcrest匹配器。containsInAnyOrder

when(myMock.myMethod(argThat(containsInAnyOrder(IN_PROGRESS, ABANDONED, EXPIRED))))
    .thenReturn(myValue);

感谢@kolobok指出,从Mockito 2.1.0(在我写完这个答案后出来的)开始,这不再有效。

因此,对于版本 2.1.0 及更高版本:

添加对 Hamcrest 的依赖关系,并使用MockitoHamcrest.argThatMockito.argThat

有关 Mockito 2.1.0 的重大更改的更多详细信息,请参见 https://www.javadoc.io/doc/org.mockito/mockito-core/2.1.0/org/mockito/ArgumentMatcher.html


推荐