mockito回调和获取参数值

时间:2011-07-08 23:58:21

标签: java mockito

我没有运气让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或传递给函数发生的事情。

4 个答案:

答案 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是地图。