mockito 回调和获取参数值

2022-08-31 10:41:19

我没有任何运气让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))

我查看了“使用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或将任何事情传递到函数中。


答案 1

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

答案 2

看看 ArgumentCaptors:

https://site.mockito.org/javadoc/current/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());
    }
  });

推荐