使用Mockito,如何验证方法是否具有某个参数?

时间:2012-08-03 20:25:51

标签: java mocking 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();  
}

方法"工作"调用" m_orderSvc"的方法(传递给对象的参数之一)。 " m_orderSvc,"反过来包含一个成员字段," m_contractsDao"。我想验证" m_contractsDao.save"被调用一次,传递给它的参数包含一定的值。

这可能有点令人困惑。让我知道如何澄清我的问题,我很高兴这样做。

3 个答案:

答案 0 :(得分:57)

首先,您需要创建一个模拟m_contractsDao并进行设置。假设该类是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(); 

最后,验证模拟是否被正确调用:

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

答案 1 :(得分:23)

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

请求验证参数是否包含某个值的请求,我可以假设你的意思是参数是一个字符串,并且你想测试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);

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

答案 2 :(得分:10)

这是更好的解决方案:

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