2011-06-23 9 views
6

Estoy aprendiendo Mockito por el momento y una de las cosas que estoy haciendo para consolidar mi aprendizaje es convertir una vieja prueba JUnit de usar una clase simulada enrollada a mano a una que usa simulacros de Mockito en su lugar. Sin embargo, me encontré con una situación que no estoy seguro de cómo manejarla.¿Es posible consultar contra argumentos pasados ​​a un objeto simulado de Mockito?

Específicamente, mi unidad bajo prueba construye un String que se pasa al objeto burlado como parámetro en una llamada de método sobre él. Me gustaría probar que el String está construido correctamente. El desafío es que parte de String es una clave hash que se genera internamente y cambia en cada invocación. Una solución que funcionaría sería mantener la generación de hash bajo mi control e inyectar un generador ficticio para la ejecución de la prueba. Sin embargo, esto es un poco de trabajo.

Mi antigua clase de simulacro robada almacenaría los argumentos que se le pasaron y que podría consultar en mi prueba. Esto me permitió a la pregunta del comienzo y al final del String a través de lo siguiente:

assertTrue(mockFtpClient.getFilePathAndName().startsWith("/data/inbound/XJSLGG.")); 
assertTrue(mockFtpClient.getFilePathAndName().endsWith(".pdf")); 

Ésta era una prueba suficiente sufficent para mi gusto. Entonces mi pregunta es, ¿es posible usar Mockito para consultar o obtener un control de los argumentos pasados ​​a un método para que pueda realizar algo similar a lo anterior?

ACTUALIZACIÓN 24/06/2011: En este punto, he exceptuado la respuesta de Gnon. Sin embargo, desde entonces descubrí algo que funciona mejor para mí. A saber, ArgumentCaptor. Así es como funciona:

ArgumentCaptor<String> fileNameArgument = ArgumentCaptor.forClass(String.class); 
verify(mockFtpClient).putFileOnServer(fileNameArgument.capture()); 
assertTrue(fileNameArgument.getValue().startsWith(START_FILE_NAME) && 
      fileNameArgument.getValue().endsWith(END_FILE_NAME)); 

el Javadoc para el estado Mockito que ArgumentCaptor es generalmente una mejor opción cuando se tiene un requisito argumento de comparación específica de una sola vez, como lo hago aquí.

+1

Gracias por la actualización, no sabía acerca de ArgumentCaptor. –

+0

¡ArgumentCaptor va a cambiar mi vida (de codificación)! –

Respuesta

3

Básicamente es necesario utilizar argThat() en Mockito, que permite tratar un Hamcrest Matcher como un argumento de verificación. Este es el código que se utiliza para hacer afirmaciones personalizados sobre un argumento pasado de entrada:

@Test 
public void testname() throws Exception { 
    HashReceiver receiver = mock(HashReceiver.class); 
    receiver.set("hash"); 
    verify(receiver).set(argThat(new HashMatcher())); 
} 

class HashMatcher extends BaseMatcher<String> { 
    @Override 
    public boolean matches(Object item) { 
     String hash = (String) item; 
     if (hash.startsWith("/data/inbound/XJSLGG.") && hash.endsWith(".pdf")) 
      return true; 
     return false; 
    } 
} 

// Mocked 
class HashReceiver { 
    public void set(String hash) { 
    } 
} 

Usted puede ser capaz de utilizar un genérico en lugar de coincidencias, o una combinación de comparadores genéricos.

+0

Gracias Gnon, creo que esta solución funciona muy bien para lo que necesito. Es una pena que haya tanto código extra, pero este no es un escenario común. –

+0

Aquí encontrará el método argThat(): http://docs.mockito.googlecode.com/hg/latest/org/mockito/Matchers.html#argThat(org.hamcrest.Matcher). Su importación debe ser 'import static org.mockito.Matchers.argThat;' –

1

Eche un vistazo a la respuesta aceptada a esta pregunta mockito-how-to-make-a-method-return-an-argument-that-was-passed-to-it que le mostrará cómo acceder a los argumentos pasados ​​a su invocación de método de prueba.

+0

No está mal, pero usar el objeto Answer para obtener un control del parámetro de entrada parece un poco retrógrado para mí y no estoy del todo seguro de que funcione con la firma de mi método de vacío. ¡Gracias! No sabía acerca de 'Responder' antes. –

Cuestiones relacionadas