java - uso - Usando Mockito, ¿cómo puedo verificar que un método fue llamado con un cierto argumento?
test unitarios junit mockito (3)
Aprovechando 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();
Al abordar su solicitud para verificar si el argumento contiene un cierto valor, podría suponer que quiere decir que el argumento es una Cadena y desea probar si el argumento Cadena contiene una subcadena. Para esto, podrías 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 incorrecta, y el argumento para save()
es una colección de algún tipo, sería ligeramente diferente:
ArgumentCaptor<Collection<MyType>> savedCaptor = ArgumentCaptor.forClass(Collection.class);
verify(mock_contractsDao).save(savedCaptor.capture());
assertTrue(savedCaptor.getValue().contains(someMyTypeElementToFindInCollection);
También puede consultar en ArgumentMatchers , si sabe cómo utilizar los adaptadores de Hamcrest.
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 JUnit, tengo
@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 "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.
Esta es la mejor solución:
verify(mock_contractsDao, times(1)).save(Mockito.eq("Parameter I''m expecting"));
Primero necesita crear un simulacro 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, inserte el simulacro 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();
Finalmente, verifique que el simulacro se haya llamado correctamente:
verify(mock_contractsDao, times(1)).save("Parameter I''m expecting");