Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

mockito callbacks and getting argument values

I'm not having any luck getting Mockito to capture function argument values! I am mocking a search engine index and instead of building an index, I'm just using a hash.

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

I can't use arbitrary arguments because I'm testing the results of queries (ie which documents they return). Likewise, I don't want to specify a specific value for and have a line for each document!

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

I looked at the callbacks section on the Using Mockito page. Unfortunately, it isn't Java and I couldn't get my own interpretation of that to work in Java.

EDIT (for clarification): How do I get get Mockito to capture an argument X and pass it into my function? I want the exact value (or ref) of X passed to the function.

I do not want to enumerate all cases, and arbitrary argument won't work because I'm testing for different results for different queries.

The Mockito page says

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

That's not java, and I don't know how to translate into java or pass whatever happened into a function.

like image 294
nflacco Avatar asked Jul 08 '11 23:07

nflacco


1 Answers

I've never used Mockito, but want to learn, so here goes. If someone less clueless than me answers, try their answer first!

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]));      }  }); 
like image 147
Ed Staub Avatar answered Sep 24 '22 10:09

Ed Staub