Использование 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" вызвано ровно один раз и что переданный ему аргумент содержит определенное значение.
Это может быть немного запутанным. Дайте мне знать, как я могу уточнить свой вопрос, и я счастлив сделать это.
Ответы
Ответ 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"));