如果在递归调用中多次调用了模拟,我可以使模拟返回不同的值吗?

时间:2019-05-05 10:38:09

标签: java unit-testing mockito

我有一个递归函数正在测试f1下。 f1调用了我正在嘲笑的数据库服务。

def f1 {
  result = databaseservicecall(arg); //mocking this
  add result to accumulator
  exit recursion if some condition is met else call f1 again.
}

我希望databaseserviecall在第一个电话中返回说r1,在第二个电话中返回r2,累加器应该有r1+r2。另外,如果我可以测试databaseservicecall被调用两次并以arg1arg2作为参数被传递,我也可以。

是否可以在mockito中执行此操作?我以为我可以使用spy,但没有真正的databaseservicecall实现。

2 个答案:

答案 0 :(得分:0)

利用thenAnswer功能(如果正在使用间谍,则doAnswer):

Integer invocationCount = Integer.valueOf(0);

when(sut.databaseservicecall(any(Argument.class))).thenAnswer((invocation) ->{
   invocationCount++;

   if(invocationCount == 1) return r1;
   if(invocationCount == 2) return r2;
   if(...)


   return null;
});

有关feature的更多信息。

答案 1 :(得分:0)

您可以串联then ()个呼叫。

when(sut.databaseservicecall(any()))
    .then(r1)
    .then(r2) ;