Java mockito给定大小的任意列表
我正在用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
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);