我没有运气让Mockito捕获函数参数值!我正在嘲笑搜索引擎索引而不是构建索引,我只是使用哈希。
// Fake index for solr
Hashmap<Integer,Document> fakeIndex;
// Add a document 666 to the fakeIndex
SolrIndexReader reader = Mockito.mock(SolrIndexReader.class);
// Give the reader access to the fake index
Mockito.when(reader.document(666)).thenReturn(document(fakeIndex(666))
我不能使用任意参数,因为我正在测试查询的结果(即他们返回的文档)。同样,我不想为每个文档指定一个特定的值并且有一行!
Mockito.when(reader.document(0)).thenReturn(document(fakeIndex(0))
Mockito.when(reader.document(1)).thenReturn(document(fakeIndex(1))
....
Mockito.when(reader.document(n)).thenReturn(document(fakeIndex(n))
我查看了Using Mockito页面上的回调部分。不幸的是,它不是Java,我无法用Java自己解释它。
编辑(澄清): 如何让Mockito获取参数X并将其传递给我的函数?我希望传递给函数的X的确切值(或ref)。
我不想枚举所有情况,任意参数都不起作用,因为我正在测试不同查询的不同结果。
Mockito页面说
val mockedList = mock[List[String]]
mockedList.get(anyInt) answers { i => "The parameter is " + i.toString }
那不是java,我不知道如何翻译成java或传递给函数发生的事情。
答案 0 :(得分:85)
我从来没有使用过Mockito,但是想学习,所以这里有。如果有人比我更无能为力,请先试试他们的答案!
Mockito.when(reader.document(anyInt())).thenAnswer(new Answer() {
public Object answer(InvocationOnMock invocation) {
Object[] args = invocation.getArguments();
Object mock = invocation.getMock();
return document(fakeIndex((int)(Integer)args[0]));
}
});
答案 1 :(得分:46)
查看ArgumentCaptors:
http://site.mockito.org/mockito/docs/1.10.19/org/mockito/ArgumentCaptor.html
ArgumentCaptor<Integer> argument = ArgumentCaptor.forClass(Integer.class);
Mockito.when(reader.document(argument.capture())).thenAnswer(
new Answer() {
Object answer(InvocationOnMock invocation) {
return document(argument.getValue());
}
});
答案 2 :(得分:20)
您可能希望将verify()与ArgumentCaptor结合使用以确保在测试中执行,并使用ArgumentCaptor来评估参数:
ArgumentCaptor<Document> argument = ArgumentCaptor.forClass(Document.class);
verify(reader).document(argument.capture());
assertEquals(*expected value here*, argument.getValue());
参数的值显然可以通过argument.getValue()进行进一步的操作/检查或任何你想做的事情。
答案 3 :(得分:10)
使用Java 8,可能是这样的:
Mockito.when(reader.document(anyInt())).thenAnswer(
(InvocationOnMock invocation) -> document(invocation.getArguments()[0]));
我假设document
是地图。