mockito any给定大小的列表

2022-08-31 20:02:52

我正在用 mockito 验证是否调用了一个方法。方法:

public void createButtons(final List<Button> buttonsConfiguration) {...}

由于传递哪个列表并不重要,因此我验证该方法的调用方式如下:

verify(mock).createButtons(Matchers.anyListOf(Button.class));

但是,大小很重要。因此,哪个并不重要,但列表必须具有X元素。ListList

这可能吗?


答案 1

一种方法是使用俘虏

ArgumentCaptor<List> captor = ArgumentCaptor.forClass(List.class);
verify(mock).createButtons(captor.capture());
assertEquals(x, captor.getValue().size()); // if expecting single list
assertEquals(x, captor.getValues().size()); // if expecting multiple lists

有关文档,请参阅 http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#15

您还可以使用自定义参数匹配器。该文档显示了一个完全符合您要求的示例:

http://docs.mockito.googlecode.com/hg/org/mockito/ArgumentMatcher.html

 class IsListOfTwoElements extends ArgumentMatcher<List> {
     public boolean matches(Object list) {
         return ((List) list).size() == 2;
     }
 }
 
 List mock = mock(List.class);
 when(mock.addAll(argThat(new IsListOfTwoElements()))).thenReturn(true);
 mock.addAll(Arrays.asList("one", "two"));
 verify(mock).addAll(argThat(new IsListOfTwoElements()));

例如,您还可以添加一个构造函数,以便指定所需的列表大小等。


答案 2

使用 Mockito 3.x 和 2.1+,您可以使用 Java 8 lambda 表达式:

verify(mock).createButtons(argThat(list -> list.size() == 5));

与Mockito 2.1及以下版本类似:

verify(mock).createButtons(argThat(list -> ((List) list).size() == 5));

要检查空虚度,甚至更容易:

verify(mock).createButtons(argThat(List::isEmpty));