2012-08-03 16 views
39

Estoy usando Mockito 1.9.0. ¿Cómo verificaría que un método se llamó exactamente una vez, y que uno de los campos que se le pasaron contenía un cierto valor? En mi prueba unitaria, tengoUsando Mockito, ¿cómo verifico que un método fue llamado con un cierto argumento?

@Before 
public void setupMainProg() { 
    // Initialize m_orderSvc, m_opportunitySvc, m_myprojectOrgSvc 
    ... 
    m_prog = new ProcessOrdersWorker(m_orderSvc, m_opportunitySvc, m_myprojectOrgSvc); 
} // setupMainProg 

@Test 
public void testItAll() throws GeneralSecurityException, IOException { 
    m_prog.work(); 
} 

El método de "trabajo" llama a un método de "m_orderSvc" (uno de los argumentos pasados ​​al objeto). "m_orderSvc," a su vez contiene un campo de miembro, "m_contractsDao". Quiero verificar que "m_contractsDao.save" haya sido llamado exactamente una vez y que el argumento que se le haya transmitido contenga un cierto valor.

Esto puede ser un poco confuso. Déjame saber cómo puedo aclarar mi pregunta y estoy feliz de hacerlo.

Respuesta

48

Primero debe crear un simulacro de m_contractsDao y configurarlo. Suponiendo que la clase es ContractsDao:

ContractsDao mock_contractsDao = mock(ContractsDao.class); 
when(mock_contractsDao.save(any(String.class))).thenReturn("Some result"); 

Luego se inyectan la maqueta en m_orderSvc y llame a su método.

m_orderSvc.m_contractsDao = mock_contractsDao; 
m_prog = new ProcessOrdersWorker(m_orderSvc, m_opportunitySvc, m_myprojectOrgSvc); 
m_prog.work(); 

Por último, verificar que la maqueta se llama correctamente:

verify(mock_contractsDao, times(1)).save("Parameter I'm expecting"); 
+9

su información, usted podría dejar fuera ', los tiempos (1) ', ya que siempre se da a entender a menos que agregue un cuantificador especificando algo que no sea exactamente una sola vez. Y en lugar de 'any (String.class)', hay un 'anyString()' ligeramente más conveniente. –

+3

También vale la pena señalar que el argumento que se pasa al método DESPUÉS de 'verificar' se compara usando 'iguales' al argumento que se pasó durante la prueba real. Entonces, sea cual sea el método (el método 'save' en el ejemplo de mamboking), piense en el _type_ de cada parámetro, y si una comparación con' iguales' es lo que realmente quiere. Si quiere que el argumento sea probado con algo que no sea 'igual', necesitará un' ArgumentMatcher' de algún tipo (que podría ser un 'ArgumentCaptor' como en la respuesta de Kevin Welker). –

+0

¿Cómo se especifica exactamente una vez, no dos o más? El comentario de @ KevinWelker dice que está implícito, pero no está seguro si significa exactamente una vez, o al menos una vez. – aliteralmind

21

edificio fuera de la respuesta de Mamboking:

ContractsDao mock_contractsDao = mock(ContractsDao.class); 
when(mock_contractsDao.save(anyString())).thenReturn("Some result"); 

m_orderSvc.m_contractsDao = mock_contractsDao; 
m_prog = new ProcessOrdersWorker(m_orderSvc, m_opportunitySvc, m_myprojectOrgSvc); 
m_prog.work(); 

Dirigiéndose a su solicitud para verificar si el argumento contiene un cierto valor, podría asumir que quiere decir que el argumento es una Cadena y desea probar si el argumento Cadena contiene una subcadena. Para este propósito puede hacer:

ArgumentCaptor<String> savedCaptor = ArgumentCaptor.forClass(String.class); 
verify(mock_contractsDao).save(savedCaptor.capture()); 
assertTrue(savedCaptor.getValue().contains("substring I want to find"); 

Si esa suposición era errónea, y el argumento a save() es una colección de algún tipo, sería sólo ligeramente diferente:

ArgumentCaptor<Collection<MyType>> savedCaptor = ArgumentCaptor.forClass(Collection.class); 
verify(mock_contractsDao).save(savedCaptor.capture()); 
assertTrue(savedCaptor.getValue().contains(someMyTypeElementToFindInCollection); 

También puede comprobar en ArgumentMatchers, si sabe cómo utilizar los adaptadores Hamcrest.

7

Esta es la mejor solución:

verify(mock_contractsDao, times(1)).save(Mockito.eq("Parameter I'm expecting")); 
+0

Esto es mejor cuando se trata de tipos no primitivos. – pisaruk

Cuestiones relacionadas