50

我正在用 mockito 验证一个方法已经被调用。方法:

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

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

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

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

这有可能吗?

4

4 回答 4

82

一种方法是使用 Captor

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()));

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

于 2013-06-28T16:44:34.783 回答
28

使用 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));
于 2019-10-02T15:10:33.493 回答
25

Hamcrest(hamcrest-library 依赖)提供了一种更简单的方法。

verify(mock).addAll((List) argThat(IsCollectionWithSize.hasSize(4)));

或带静态import org.hamcrest.collection.IsCollectionWithSize;

verify(mock).addAll((List) argThat(hasSize(4)));
于 2016-06-08T22:06:25.107 回答
1

这是我的工作示例:

  List<Object> objects = mock(List.class);
  when(objects.size()).thenReturn(1000);
于 2019-12-10T07:59:53.047 回答