mockitocallback和获取参数值

我没有任何运气让Mockito捕捉函数参数值! 我嘲笑search引擎索引,而不是build立一个索引,我只是使用散列。

// 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)) 

我不能使用任意的参数,因为我正在testing查询的结果(即他们返回的文档)。 同样,我不想为每个文档指定一个特定的值,并且有一行!

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

我查看了使用Mockito页面上的callback部分。 不幸的是,这不是Java,我无法得到我自己的解释,在Java中工作。

编辑(澄清):我如何得到Mockito捕获参数X并将其传递到我的函数? 我想要X的确切值(或参考)传递给函数。

我不想枚举所有的情况,任意的参数将不起作用,因为我正在testing不同的查询结果。

Mockito页面说

 val mockedList = mock[List[String]] mockedList.get(anyInt) answers { i => "The parameter is " + i.toString } 

这不是Java,我不知道如何翻译成Java或传递到一个函数。

我从来没有使用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])); } }); 

检查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()); } }); 

您可能希望将verify()与ArgumentCaptor结合使用以确保在testing中执行,并使用ArgumentCaptor来评估参数:

 ArgumentCaptor<Document> argument = ArgumentCaptor.forClass(Document.class); verify(reader).document(argument.capture()); assertEquals(*expected value here*, argument.getValue()); 

参数的值显然可以通过argument.getValue()进行进一步的操作/检查或任何你想做的事情。

对于Java 8,这可能是这样的:

 Mockito.when(reader.document(anyInt())).thenAnswer( (InvocationOnMock invocation) -> document(invocation.getArguments()[0])); 

我假设document是一张地图。