Подтвердить что ты не робот

Использование Mockito, как я могу проверить, был ли метод вызванным с определенным аргументом?

Я использую Mockito 1.9.0. Как я могу проверить, вызван ли метод один раз, и что одно из полей, переданных ему, содержит определенное значение? В моем тесте JUnit у меня есть

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

Метод "work" вызывает метод "m_orderSvc" (один из аргументов, переданных объекту). "m_orderSvc", в свою очередь, содержит поле участника, "m_contractsDao". Я хочу проверить, что "m_contractsDao.save" вызвано ровно один раз и что переданный ему аргумент содержит определенное значение.

Это может быть немного запутанным. Дайте мне знать, как я могу уточнить свой вопрос, и я счастлив сделать это.

4b9b3361

Ответ 1

Сначала вам нужно создать макет m_contractsDao и настроить его. Предполагая, что класс является ContractsDao:

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

Затем введите mock в m_orderSvc и вызовите ваш метод.

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

Наконец, убедитесь, что макет был вызван правильно:

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

Ответ 2

Ответ на вопрос о мамбокинге:

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

Адресация вашего запроса, чтобы проверить, содержит ли аргумент определенное значение, я мог предположить, что вы имеете в виду, что аргумент является String, и вы хотите проверить, содержит ли аргумент String подстроку. Для этого вы можете сделать:

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

Если это предположение было неправильным, а аргумент save() представляет собой набор какого-то рода, он будет немного отличаться:

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

Вы также можете проверить ArgumentMatchers, если вы знаете, как использовать сочетания Hamcrest.

Ответ 3

Это лучшее решение:

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