我有以下方法,我试图嘲笑。
public T myFunction(List<T>);
Mockito可以返回列表的第一个元素吗?
答案 0 :(得分:4)
当然。只需在行为记录中指定它:
List<Foo> list = ...;
Mockito.when(myMock.myFunction(list))
.thenReturn(list.get(0));
请注意,mock将返回记录模拟行为时指定的元素
如果要在运行时返回列表中包含的第一个元素,则应该以这种方式使用when().then(Answer)
:
List<Foo> list = ...;
Mockito.when(myMock.myFunction(list))
.then(invocation ->
((List<Foo>) invocation.getArguments()[0])).get(0));
答案 1 :(得分:1)
获取传递给方法的List
的第一个元素:
when(whatever.myFunction(anyList()))
.then(invocation -> invocation.getArgumentAt(0, List.class).get(0));
答案 2 :(得分:1)
添加到davidxxx的答案,你也可以使用thenAnswer而不是thenReturn到stub方法
Mockito.when(myMock.myFunction(anyList()))
.thenAnswer(new Answer(){
Object answer(InvocationOnMock invocation) {
Object[] args = invocation.getArguments();
List mock = (List)invocation.getMock();
return mock.get(0);
}
});
答案 3 :(得分:1)
所有答案在技术上都是正确的......但是给出了不同的观点:不要创建复杂的测试!
请记住,您只想做“最小控制”。您可以创建测试设置,执行某些操作,检查/验证结果。
从这个意义上说:考虑不根据投入回报某些东西。而期望特定输入,并返回固定的硬编码值。
你可以编程模拟以像“正在完成工作的程序”那样的事实并不意味着你应该这样做。
唯一的好理由是,如果您有许多类似的测试用例,这种额外的复杂性实际上会提高测试代码的质量。