Mockito - 返回传递给方法的列表的第一个元素

时间:2018-05-22 13:38:06

标签: java mockito

我有以下方法,我试图嘲笑。

public T myFunction(List<T>);

Mockito可以返回列表的第一个元素吗?

4 个答案:

答案 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)

所有答案在技术上都是正确的......但是给出了不同的观点:不要创建复杂的测试!

请记住,您只想做“最小控制”。您可以创建测试设置,执行某些操作,检查/验证结果。

从这个意义上说:考虑不根据投入回报某些东西。而期望特定输入,并返回固定的硬编码值。

可以编程模拟以像“正在完成工作的程序”那样的事实并不意味着你应该这样做。

唯一的好理由是,如果您有许多类似的测试用例,这种额外的复杂性实际上会提高测试代码的质量。