Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java mockito给定大小的任意列表_Java_List_Mockito - Fatal编程技术网

Java mockito给定大小的任意列表

Java mockito给定大小的任意列表,java,list,mockito,Java,List,Mockito,我正在用mockito验证是否调用了一个方法。方法: public void createButtons(final List<Button> buttonsConfiguration) {...} 但是,列表的大小很重要。因此,无论哪个列表,列表都必须有X个元素 这有可能吗?一种方法是使用捕获者 ArgumentCaptor<List> captor = ArgumentCaptor.forClass(List.class); verify(mock).createB

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

public void createButtons(final List<Button> buttonsConfiguration) {...}
但是,
列表的大小很重要。因此,无论哪个
列表
,列表都必须有X个元素


这有可能吗?

一种方法是使用捕获者

ArgumentCaptor<List> captor = ArgumentCaptor.forClass(List.class);
verify(mock).createButtons(captor.capture());
assertEquals(x, captor.getValue().size()); // or if expecting multiple lists:
assertEquals(x, captor.getValues().size());
ArgumentCaptor captor=ArgumentCaptor.forClass(List.class);
验证(mock).createButtons(captor.capture());
assertEquals(x,captor.getValue().size());//或者,如果需要多个列表:
assertEquals(x,captor.getValues().size());
有关文档,请参阅

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

类IsListOfTwoElements扩展ArgumentMatcher{
公共布尔匹配(对象列表){
返回((列表)列表).size()=2;
}
}
List mock=mock(List.class);
when(mock.addAll(argThat(new IsListOfTwoElements()))。然后返回(true);
mock.addAll(Arrays.asList(“一”、“二”));
验证(mock).addAll(argThat(new IsListOfTwoElements());
例如,您还可以添加一个构造函数,以便指定所需的列表大小等。

Hamcrest(Hamcrest library jar)提供了一种更简单的方法

verify(mock).addAll((List) argThat(IsCollectionWithSize.hasSize(4)));
或使用静态
导入org.hamcrest.collection.IsCollectionWithSize

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

对于Mockito 3.x,您可以使用Java 8 lambda表达式:

verify(mock).createButtons(argThat(list -> list.size() == 5));
与Mockito 2.x类似:

verify(mock).createButtons(argThat(list -> ((List) list).size() == 5));
要检查空性,则更容易:

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

以下是我的工作示例:

  List<Object> objects = mock(List.class);
  when(objects.size()).thenReturn(1000);
List objects=mock(List.class);
当(objects.size())。然后返回(1000);

未来的读者:请注意,尽管Mockito文档逐字记录了此示例ArgumentMatcher,但它不能容忍
null
或非
列表类型。这可能导致NPE或ClassCastException。更全面的解决方案可以使用
TypeSafeMatcher
,或者类似于
的保护,如果(!(list instanceof list))返回false
;无法接受键入的列表否?有点像是无精打采的无精打采。请参阅下面gertas的答案。如果您的参数是
Collection
,则此选项有效。如果您有
List
您需要强制转换.yes,只是为了澄清:您必须这样强制转换:
verify(mock).addAll((List)argThat(IsCollectionWithSize.hasSize(4))应该是SimplicityFableus的最佳答案。非常感谢。请把这个投票到无穷大
verify(mock).createButtons(argThat(List::isEmpty));
  List<Object> objects = mock(List.class);
  when(objects.size()).thenReturn(1000);