2012-09-14 21 views
10

Estoy escribiendo pruebas de unidad para mi aplicación y me preguntaba si es posible que el marco Mockito afecte a un objeto que se pasa a un método que devuelve vacío de una clase burlada . Por ejemplo, llamar a una clase de validación simulada que contiene un método que devuelve vacío pero rastrea varios cambios y metadatos a través de un objeto pasado como un argumento. .Cómo simular un método de devolución nulo que afecta a un objeto

public GetCartItemsOutput getCartItems(GetCartItemsInput getCartItemsInput) { 
    CartItemsFilter cartItemsFilter = new CartItemsFilter(); 
    validator.validateCartItemsInput(getCartItemsInput, cartItemsFilter); ... 

que se burlaban de la clase validador para mis otras pruebas, pero para esto necesito burlarse de los cambios en el objeto cartItemsFilter la que no sé cómo hacerlo.

Respuesta

18

La respuesta es sí, puede, y hay básicamente dos niveles de hacerlo, según la necesidad de su prueba.

Si simplemente desea probar la interacción con el objeto burlado, puede simplemente usar el método verify(), para verificar que se haya llamado al método void.

Si su prueba realmente necesita el objeto burlado de modificar parámetros que recibe, necesitará implementar un Answer:

editado para mostrar la forma apropiada de usar respuesta con el método de vacío

doAnswer(new Answer() { 
    Object answer(InvocationOnMock invocation) { 
     Object[] args = invocation.getArguments(); 
     ((MyClass)args[0]).myClassSetMyField(NEW_VALUE); 
     return null; // void method, so return null 
    } 
}).when(mock).someMethod(); 
+0

Gracias por su ayuda. Me tomó un tiempo para entender "((MyClass) args [0]). MyClassSetMyField (NEW_VALUE);", pero finalmente descubrí que el punto era establecer los parámetros del argumento que pasé en mi método de burlarse. Nuevamente, ty. – tamuren

0

ArgumentCaptor también podría ayudar.

He aquí un fragmento encontrado de here:

ArgumentCaptor<GetCartItemsInput > argument = ArgumentCaptor.forClass(GetCartItemsInput .class); 
    verify(mock).getCartItems(argument.capture()); 
    assertEquals(cartItemsFilter, argument.getValue()); 
+1

Esto no resuelve el problema de la operación, él necesita implementar una Respuesta – iwein

1

Para añadir a la respuesta de Kevin Welker, si su MyClass es una clase personalizada, a continuación, definir un método equals/código hash en ella, de modo que Mockito puede usarlo para que coincida exactamente con el método.

En mi caso, "MyClass" estaba en una API de terceros, así que tuve que utilizar el método de "cualquiera" de la siguiente manera -

doAnswer(new Answer() { 
    Object answer(InvocationOnMock invocation) { 
     Object[] args = invocation.getArguments(); 
     ((MyClass)args[0]).myClassSetMyField(NEW_VALUE); 
     return null; // void method, so return null 
    } 
}).when(mock).someMethod(any(MyClass.class)); 
Cuestiones relacionadas