Mockito验证在我的情况下调用一次函数

use*_*225 2 java unit-testing mockito

我正在使用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() {...}
}
Run Code Online (Sandbox Code Playgroud)

在我的单元测试中,我想测试一下这个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?
   }
}
Run Code Online (Sandbox Code Playgroud)

countIncludeTeacher()在我的测试用例中,如何使用Mockito进行检查/验证一次?

Tun*_*aki 6

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

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

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

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