Não estou tendo sorte em fazer o Mockito capturar os valores dos argumentos da função! Estou zombando de um índice de mecanismo de pesquisa e, em vez de construir um índice, estou apenas usando um 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))
Não posso usar argumentos arbitrários porque estou testando os resultados das consultas (ou seja, quais documentos eles retornam). Da mesma forma, não quero especificar um valor específico e ter uma linha para cada documento!
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))
Eu olhei para a seção de retornos de chamada na página Usando o Mockito . Infelizmente, não é Java e eu não consegui fazer minha própria interpretação disso funcionar em Java.
EDITAR (para esclarecimento): Como faço para que o Mockito capture um argumento X e o transmita para minha função? Quero que o valor exato (ou ref) de X seja passado para a função.
Não quero enumerar todos os casos e o argumento arbitrário não funciona porque estou testando resultados diferentes para consultas diferentes.
A página Mockito diz
val mockedList = mock[List[String]]
mockedList.get(anyInt) answers { i => "The parameter is " + i.toString }
Isso não é java, e eu não sei como traduzir para java ou passar o que aconteceu em uma função.
fonte
Mockito.when(reader.document(666)).thenReturn(document(fakeIndex(666))
deve configurar o objeto mock para você. O que acontece quando você ligareader.document(666)
?Respostas:
Nunca usei o Mockito, mas quero aprender, então aqui vai. Se alguém menos sem noção do que eu responder, tente a resposta primeiro!
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])); } });
fonte
Confira 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()); } });
fonte
ArgumentCaptor
s para fazer stub. No entanto, há um grande aviso sobre isso nesse link. Prossiga com cuidado.Você pode querer usar verify () em combinação com o ArgumentCaptor para garantir a execução no teste e o ArgumentCaptor para avaliar os argumentos:
O valor do argumento é obviamente acessível através do argument.getValue () para posterior manipulação / verificação ou o que você desejar fazer.
fonte
Com o Java 8, isso poderia ser algo assim:
Mockito.when(reader.document(anyInt())).thenAnswer( (InvocationOnMock invocation) -> document(invocation.getArguments()[0]));
Presumo que
document
seja um mapa.fonte