when uso usar unitarios test mock datos como java mocking mockito

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");