Usando Mockito, come posso verificare che un metodo sia stato chiamato con un certo argomento?

Sto usando Mockito 1.9.0. Come potrei verificare che un metodo sia stato chiamato esattamente una volta e che uno dei campi passati ad esso contenesse un certo valore? Nel mio test JUnit, ho

@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(); } 

Il metodo “lavoro” chiama un metodo di “m_orderSvc” (uno degli argomenti passati all’object). “m_orderSvc”, a sua volta contiene un campo membro, “m_contractsDao”. Voglio verificare che “m_contractsDao.save” sia stato chiamato esattamente una volta e che l’argomento passato ad esso contenga un certo valore.

Questo potrebbe essere un po ‘di confusione. Fammi sapere come posso chiarire la mia domanda e sono felice di farlo.

Per prima cosa è necessario creare un falso m_contractsDao e configurarlo. Supponendo che la class sia contrattuale:

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

Quindi iniettare il mock in m_orderSvc e chiamare il metodo.

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

Infine, verifica che la simulazione sia stata chiamata correttamente:

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

Costruire la risposta di 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(); 

Affrontando la tua richiesta per verificare se l’argomento contiene un certo valore, potrei supporre che tu voglia dire che l’argomento è una stringa e che vuoi verificare se l’argomento String contiene una sottostringa. Per questo potresti fare:

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

Se quell’ipotesi fosse sbagliata e l’argomento di save() fosse una raccolta di qualche tipo, sarebbe solo leggermente diverso:

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

Si può anche verificare in ArgumentMatchers , se si sa come usare i controllori di Hamcrest.

Questa è la soluzione migliore:

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