En utilisant Mockito, comment puis-je vérifier qu’une méthode a été appelée avec un certain argument?

J’utilise Mockito 1.9.0. Comment pourrais-je vérifier qu’une méthode a été appelée exactement une fois et que l’un des champs qui lui a été transmis contenait une certaine valeur? Dans mon test JUnit, j’ai

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

La méthode “work” appelle une méthode de “m_orderSvc” (un des arguments transmis à l’object). “m_orderSvc”, à son tour, contient un champ membre, “m_contractsDao”. Je veux vérifier que “m_contractsDao.save” a été appelé exactement une fois et que l’argument qui lui est transmis contient une certaine valeur.

Cela peut être un peu déroutant. Dites-moi comment je peux clarifier ma question et je suis heureux de le faire.

Tout d’abord, vous devez créer un modèle m_contractsDao et le configurer. En supposant que la classe est ContractsDao:

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

Ensuite, injectez la maquette dans m_orderSvc et appelez votre méthode.

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

Enfin, vérifiez que le simulacre a été appelé correctement:

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

En se basant sur la réponse de Mamboking:

 ContractsDao mock_contractsDao = mock(ContractsDao.class); when(mock_contractsDao.save(anySsortingng())).thenReturn("Some result"); m_orderSvc.m_contractsDao = mock_contractsDao; m_prog = new ProcessOrdersWorker(m_orderSvc, m_opportunitySvc, m_myprojectOrgSvc); m_prog.work(); 

En adressant votre demande pour vérifier si l’argument contient une certaine valeur, je peux supposer que vous voulez dire que l’argument est une chaîne et que vous voulez tester si l’argument Ssortingng contient une sous-chaîne. Pour cela, vous pourriez faire:

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

Si cette hypothèse était fausse, et que l’argument de save() est une collection quelconque, il ne serait que légèrement différent:

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

Vous pouvez également vérifier dans ArgumentMatchers , si vous savez comment utiliser les matchers Hamcrest.

C’est la meilleure solution:

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