Mockitovalidation在我的情况下调用一次函数

我正在使用Mockito来编写我的测试用例。 我有一个简单的类,其中包含一个函数countPerson(boolean) ,我有兴趣测试它:

 public class School { //School is a singleton class. public void countPerson(boolean includeTeacher) { if (includeTeacher) { countIncludeTeacher(); return; } countOnlyStudents(); } public void countIncludeTeacher() {...} public void countOnlyStudents() {...} } 

在我的unit testing中,我想测试countPerson(boolean)函数:

 public class SchoolTest{ private School mSchool; @Before public void setUp(){ mSchool = School.getInstance(); } @Test public void testCountPerson() { mSchool.countPerson(true); //How to test/verify countIncludeTeacher() is invoked once? } } 

如何使用Mockito检查/validationcountIncludeTeacher()在我的测试用例中被调用一次?

你将不得不使用间谍 。 这里的问题是你要validation一个方法是在一个真实对象上调用的,而不是在一个模拟上。 你不能在这里使用mock,因为它会存在类中的所有方法,因此默认情况下也countPerson

 @Test public void testCountPerson() { School school = School.getInstance(); School spySchool = Mockito.spy(school); spySchool.countPerson(true); verify(spySchool).countIncludeTeacher(); } 

但是,请注意在使用间谍时应该非常小心,因为除非存在,否则真正的方法会被调用。 引用Mockito Javadoc:

应该谨慎使用真正的间谍,例如在处理遗留代码时。

如果您只需要一次调用,则可以使用

 verify(mSchool, times(1)).countIncludeTeacher(); 

我想检查交互,你不关心它发生的频率,做

 verify(mSchool).countIncludeTeacher(); 
 verify(mSchool, times(1)).countIncludeTeacher(); 

编辑:正如@Tunaki所说,这不起作用。 你应该使用间谍。

你有两个选择。

  • 设置学校,这样就有X老师和Y学生,并确认返回X + Y或X. 这将是我的偏好,因为嘲笑你正在测试的课程对我来说感觉很蠢。 这两种方法应该经过充分测试,因此任何错误都会在测试中被捕获。
  • 按照Tunaki的建议使用间谍。

你需要这样做

 Mockito.doNothing().when(mock).countIncludeTeacher();