web-dev-qa-db-fra.com

Avec 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 qu'un des champs qui lui ont été transmis contient 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" (l'un des arguments transmis à l'objet). "m_orderSvc" contient à son tour 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. Faites-moi savoir comment je peux clarifier ma question et je le ferai avec plaisir.

51
Dave

Vous devez d’abord 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(String.class))).thenReturn("Some result");

Puis 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 la maquette a bien été appelée:

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

Construire à partir de la réponse 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(); 

Adressant votre demande pour vérifier si l'argument contient une certaine valeur, je pourrais supposer que vous voulez dire que l'argument est une chaîne et que vous voulez tester si la chaîne l'argument contient une sous-chaîne. Pour cela vous pourriez faire:

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

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

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

Vous pouvez également vérifier ArgumentMatchers , si vous savez utiliser les correspondeurs Hamcrest.

23
Kevin Welker

C'est la meilleure solution:

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