Tengo una llamada al método que quiero burlarme de mockito. Para empezar, he creado e inyectado una instancia de un objeto en el que se llamará al método. Mi objetivo es verificar uno de los objetos en la llamada al método.
¿Hay alguna forma en que mockito le permita afirmar o verificar el objeto y sus atributos cuando se llama al método simulado?
ejemplo
Mockito.verify(mockedObject)
.someMethodOnMockedObject(
Mockito.<SomeObjectAsArgument>anyObject())
En lugar de hacerlo, anyObject()
quiero verificar que el objeto de argumento contenga algunos campos particulares
Mockito.verify(mockedObject)
.someMethodOnMockedObject(
Mockito.<SomeObjectAsArgument>**compareWithThisObject()**)
Respuestas:
La nueva función agregada a Mockito lo hace aún más fácil,
Echa un vistazo a la documentación de Mockito
En caso de que haya más de un parámetro y se desee capturar solo un parámetro, use otros ArgumentMatchers para ajustar el resto de los argumentos:
fuente
Creo que la forma más fácil de verificar un objeto de argumento es usar el
refEq
método:Se puede usar incluso si el objeto no se implementa
equals()
, porque se usa la reflexión. Si no desea comparar algunos campos, simplemente agregue sus nombres como argumentos pararefEq
.fuente
Una posibilidad más, si no desea usar
ArgumentCaptor
(por ejemplo, porque también está usando stubbing), es usar Hamcrest Matchers en combinación con Mockito.fuente
Matchers
paquete sea correcto, ya que escribir la misma línea de código con laorg.mockito.Matchers
clase arroja una excepción engañosa que indica que el parámetro de la función simulada simplemente no coincide.MockitoHamcrest.argThat()
y noMockito.argThat()
Esta es una respuesta basada en la respuesta de iraSenthil pero con anotación ( Captor ). En mi opinión tiene algunas ventajas:
Ejemplo:
fuente
captor.getAllValues()
. El métodocaptor.getValue()
que se utiliza en la respuesta ofrece el último resultado.Si usa Java 8, puede usar expresiones Lambda para que coincidan.
Llamada de ejemplo
Más información: http://source.coveo.com/2014/10/01/java8-mockito/
fuente
Las soluciones anteriores realmente no funcionaron en mi caso. No pude usar ArgumentCaptor ya que el método fue llamado varias veces y necesitaba validar cada uno. Un simple Matcher con "argThat" hizo el truco fácilmente.
Matcher personalizado
Test Runner
fuente
Y una solución muy agradable y limpia en koltin de
com.nhaarman.mockito_kotlin
fuente
Puedes referir lo siguiente:
Esto verificará si el método de mockedObject se llama con el objeto deseado como parámetro.
fuente
Otra forma fácil de hacerlo:
fuente
¡El javadoc para refEq mencionó que el control de igualdad es superficial! Puede encontrar más detalles en el siguiente enlace:
[ https://static.javadoc.io/org.mockito/mockito-core/2.2.29/org/mockito/ArgumentMatchers.html#refEq(T,%20java.lang.String...)font>[1]
El problema de "igualdad superficial" no se puede controlar cuando utiliza otras clases que no implementan el método .equals (), la clase "DefaultMongoTypeMapper" es un ejemplo en el que no se implementa el método .equals ().
org.springframework.beans.factory.support ofrece un método que puede generar una definición de bean en lugar de crear una instancia del objeto, y se puede usar para eliminar el error de comparación.
** "La definición del bean es solo una descripción del bean, no un bean en sí. Las descripciones del bean implementan correctamente equals () y hashCode (), por lo que en lugar de crear un nuevo DefaultMongoTypeMapper () proporcionamos una definición que le dice a Spring cómo funciona. debería crear uno "
En tu ejemplo, puedes hacer algo así
fuente
Una solución simplificada, sin crear una nueva clase de implementación de Matcher y usar la expresión lambda:
fuente