在 mockito 中动态链接“thenReturn”

我有一个元组模拟类,它的getString(0)和getString(1)方法应该被调用n次。而不是写这样的东西,

when(tuple.getString(0)).thenReturn(logEntries[0]).thenReturn(logEntries[1])...thenReturn(logEntries[n - 1])

手动,我尝试了以下操作:

OngoingStubbing stubbingGetStringZero = when(tuple.getString(0)).thenReturn(serviceRequestKey);
OngoingStubbing stubbingGetStringOne = when(tuple.getString(1)).thenReturn(logEntries[0]);
for (int i = 1; i < n; i++) {
    stubbingGetStringZero = stubbingGetStringZero.thenReturn(serviceRequestKey);
    stubbingGetStringOne = stubbingGetStringOne.thenReturn(logEntries[i]);
}

预期的结果是,所有 对 的调用都应返回 String,而 对 的每个调用都应返回不同的 String,即。第 i 次调用 tuple.getString(1) 返回 logEntries 数组的第 i 个元素。tuple.getString(0)serviceRequestKeytuple.getString(1)logEntries[i]

但是,由于一些奇怪的原因,事情变得混乱,第二次调用返回字符串而不是。我在这里错过了什么?tuple.getString(1)serviceRequestKeylogEntries[1]


答案 1

好吧,正确的方法是:

import org.mockito.AdditionalAnswers;

String[] logEntry = // Some initialization code
List<String> logEntryList = Arrays.asList(logEntry);
when(tuple.getString(1)).thenAnswer(AdditionalAnswers.returnsElementsOf(logEntryList));

每次调用时,都会返回 logEntry 数组的后续元素。因此,对 i 的调用返回 logEntry 数组的第 i 个元素。tuple.getString(1)

P.S:returnsElementsOf(在撰写本文时)文档中的示例未更新(它仍然使用ReturnsElementsOf示例):http://docs.mockito.googlecode.com/hg/1.9.5/org/mockito/AdditionalAnswers.html#returnsElementsOf(java.util.Collection)it


答案 2

如果我理解得很好,你希望你的模拟根据调用返回不同的结果(意味着第一次调用时的结果1,第二次调用时的结果2等)-这可以通过这样的事情来完成

Mockito.when(tuple.getString(0)).thenReturn(serviceRequestKey,logEntries[0],logEntries[1])

有了这个,您将在第一次调用时获得serviceRequestKey,在第二次调用时获得logEntries[0],依此类推...

如果你想要更复杂的东西,比如根据方法中的参数改变回报,那么Answer()如下图所示


推荐