¡No tengo suerte para que Mockito capture valores de argumentos de función! Me estoy burlando de un índice de motor de búsqueda y en lugar de construir un índice, solo estoy usando un 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))
No puedo usar argumentos arbitrarios porque estoy probando los resultados de las consultas (es decir, qué documentos devuelven). Del mismo modo, no quiero especificar un valor específico y tener una línea 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))
Miré la sección de devoluciones de llamada en la página Uso de Mockito . Desafortunadamente, no es Java y no pude hacer que mi propia interpretación de eso funcione en Java.
EDITAR (para aclarar): ¿Cómo consigo que Mockito capture un argumento X y lo pase a mi función? Quiero que el valor exacto (o referencia) de X se pase a la función.
No quiero enumerar todos los casos, y el argumento arbitrario no funcionará porque estoy probando diferentes resultados para diferentes consultas.
La página de Mockito dice
val mockedList = mock[List[String]]
mockedList.get(anyInt) answers { i => "The parameter is " + i.toString }
Eso no es Java, y no sé cómo traducir a Java o pasar lo que sea que haya pasado a una función.
fuente
Mockito.when(reader.document(666)).thenReturn(document(fakeIndex(666))
debería configurar el objeto simulado por ti. ¿Qué pasa cuando llamasreader.document(666)
?Respuestas:
Nunca he usado Mockito, pero quiero aprender, así que aquí va. Si alguien menos despistado que yo responde, ¡prueba su respuesta primero!
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])); } });
fuente
Consulte 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()); } });
fuente
ArgumentCaptor
s para cortar. Sin embargo, hay una gran advertencia al respecto en ese enlace. Proceda con precaución.Es posible que desee utilizar verify () en combinación con ArgumentCaptor para asegurar la ejecución en la prueba y ArgumentCaptor para evaluar los argumentos:
Obviamente, se puede acceder al valor del argumento a través de argument.getValue () para una mayor manipulación / verificación o lo que desee hacer.
fuente
Con Java 8, esto podría ser algo como esto:
Mockito.when(reader.document(anyInt())).thenAnswer( (InvocationOnMock invocation) -> document(invocation.getArguments()[0]));
Supongo que
document
es un mapa.fuente