2012-08-03 75 views
39

我正在使用Mockito 1.9.0。我将如何验证一个方法只被调用一次,并且传递给它的某个字段包含某个值?在我的JUnit测试,我有使用Mockito,我该如何验证某个方法是否被某个参数调用?

@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”被调用了一次,并且传递给它的参数包含一个特定的值。

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

回答

48

首先,您需要创建一个模拟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"); 
+9

仅供参考,你可以离开过',时间(1)',因为它总是暗示,除非你添加一个量词指定比只有一个时间以外的东西。而不是'any(String.class)',有一​​个更方便的'anyString()'。 – 2012-08-03 21:08:18

+3

值得注意的是,传递给AFTER'verify'方法的参数是用'equals'与实际测试期间传递的参数进行比较的。所以,不管是什么方法(在mamboking的例子中是'save'方法),想一想每个参数的_type_,以及与'equals'的比较是否是你真正想要的。如果你想要用“equals”之外的东西来测试参数,你需要一个“ArgumentMatcher”(这可能是Kevin Welker的答案中的“ArgumentCaptor”)。 – 2012-08-05 05:45:54

+0

你如何指定一次,而不是两次或更多? @ KevinWelker的评论说这是隐含的,但不确定它是否意味着一次,或者至少一次。 – aliteralmind 2015-06-19 18:53:19

21

大厦关闭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); 

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

7

这是更好的解决方案:

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

这样比较好当你在处理非原始类型时。 – pisaruk 2017-03-03 22:37:01

相关问题