使用Mockito,我如何validation一个方法被调用了一定的参数?

我正在使用Mockito 1.9.0。 我将如何validation一个方法被调用一次,并传递给它的一个领域包含一定的价值? 在我的JUnittesting中,我有

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

方法“工作”调用“m_orderSvc”(传递到对象的参数之一)的方法。 “m_orderSvc”又包含一个成员字段“m_contractsDao”。 我想validation一下“m_contractsDao.save”被调用了一次,并且传递给它的参数包含一个特定的值。

这可能有点混乱。 让我知道如何澄清我的问题,我很乐意这样做。

首先你需要创build一个模拟m_contractsDao并设置它。 假设class级是ContractsDao:

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

然后注入m_orderSvc模拟器并调用你的方法。

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

最后,validation模拟是否正确调用:

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

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

解决你的请求,以validation参数是否包含一个特定的值,我可以假设你的意思是参数是一个string,你想testing是否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()的参数是某种types的集合,那么它只会稍有不同:

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

如果你知道如何使用Hamcrest匹配器,你也可以检查ArgumentMatchers 。

这是更好的解决scheme:

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