Busqué en Google esto, pero no encontré nada relevante. Tengo algo como esto:
Object obj = getObject();
Mockeable mock= Mockito.mock(Mockeable.class);
Mockito.when(mock.mymethod(obj )).thenReturn(null);
Testeable testableObj = new Testeable();
testableObj.setMockeable(mock);
command.runtestmethod();
Ahora, quiero verificar que mymethod(Object o)
, que se llama dentro runtestmethod()
, se llamó con el Objeto o
, no con ningún otro. Pero siempre paso la prueba, lo que sea que ponga en la verificación, por ejemplo, con:
Mockito.verify(mock.mymethod(Mockito.eq(obj)));
o
Mockito.verify(mock.mymethod(Mockito.eq(null)));
o
Mockito.verify(mock.mymethod(Mockito.eq("something_else")));
Siempre paso la prueba. ¿Cómo puedo lograr esa verificación (si es posible)?
Gracias.
java
unit-testing
junit
mockito
manolowar
fuente
fuente
¿Estás tratando de hacer la igualdad lógica utilizando el método .equals del objeto? Puede hacerlo utilizando el emparejador argThat que se incluye en Mockito
A continuación, puede implementar su propio emparejador de argumentos que diferirá para cada método .equals de objetos
Ahora, usando su código, puede actualizarlo para leer ...
Si solo busca la igualdad EXACTA (mismo objeto en la memoria), simplemente haga
Esto verificará que se haya llamado una vez.
fuente
ReflectionEquals
clase para esos fines.verify(mock).mymethod(obj);
no verifica la igualdad EXACTA (mismo objeto en la memoria). En su lugar, utiliza el método equals de objetos que podría haberse anulado.ArgumentMatcher
ser menos detallado.verify()
invoca elequals()
método / argumento de entrada , en lugar del método / objeto grabadoequals()
. Esto es irrelevante a menos que esté tratando de confirmar que su sujeto de prueba devuelve una instancia de objeto específica, y el sujeto devuelve lo que se supone que es un decorador transparente de esa instancia. Elverify
argumentoequals()
no sabría del decorador; mientras que el decoradorequals()
sería reescrito para tolerar el original. En este caso, su prueba fallará falsamente.eq
matcher si no utiliza otros matchers..verify(mock)
. Ahora está iniciando la verificación del resultado de la llamada al método, sin verificar nada (sin hacer una llamada al método). Por lo tanto, todas las pruebas están pasando.Su código debe verse así:
fuente
argThat
más lambdaasí es como puede fallar la verificación de su argumento:
dónde
argThat
más afirmala prueba anterior "dirá"
Expected: lambda$... Was: YourClass.toSting...
. Puede obtener una causa más específica de la falla si usa afirmaciones en la lambda:PERO: ESTO SOLO FUNCIONA CON 1 LLAMADA DE MÉTODO. Si el método verificado se llama 2 o más veces, mockito pasa todas las combinaciones llamadas a cada verificador. Entonces, mockito espera que su verificador regrese silenciosamente
true
para uno de los argumentos establecidos yfalse
(sin excepciones de afirmación) para otras llamadas válidas. Esa expectativa no es un problema para 1 llamada al método, solo debe devolver 1 vez verdadero.Ahora la prueba dice:
Expected: Obj.description to contain 'KEY'. Was: 'Actual description'
. NOTA: UtilicéassertJ
afirmaciones, pero depende de usted qué marco de afirmación usar.argThat
con múltiples argumentosSi usa
argThat
, todos los argumentos deben ser provistos con coincidencias. P.ej:dónde:
eq
matcherLa forma más fácil de verificar si el argumento es igual:
argumento directo
Si la comparación por referencia es aceptable, continúe con:
La causa fundamental del fracaso pregunta original era el lugar equivocado de las paranthes:
verify(mock.mymethod...
. Eso estuvo mal. El derecho sería:verify(mock).*
fuente
He usado Mockito.verify de esta manera
fuente
¿Ha verificado el método de igualdad para la clase simulable? Si este devuelve siempre verdadero o prueba la misma instancia contra la misma instancia y el método de igualdad no se sobrescribe (y por lo tanto solo verifica las referencias), entonces devuelve verdadero.
fuente
El otro método es usar el método org.mockito.internal.matchers.Equals.Equals en lugar de redefinir uno:
fuente
¿Lo has probado con el mismo () matcher? Como en:
Yo tuve el mismo problema. Lo probé con el igualador eq () así como con el igualador refEq () pero siempre tuve falsos positivos. Cuando utilicé el mismo () matcher, la prueba falló cuando los argumentos eran instancias diferentes y pasaban una vez que los argumentos eran la misma instancia.
fuente
También puede usar TypeSafeDiagnosingMatcher
Luego verifique esa invocación:
fuente