簡體   English   中英

Mockito驗證在我的情況下一次調用一個函數

[英]Mockito verify a function is invoked once in my case

我正在使用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() {...}
}

在我的單元測試中,我想測試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來檢查/驗證countIncludeTeacher()一次?

您將不得不使用間諜 這里的問題是您要驗證是否在真實對象而非模擬對象上調用了方法。 您不能在此處使用模擬,因為它將對類中的所有方法進行存根,因此也將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的建議使用Spy。

你需要這樣

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM