2.9 顯式驗證

對于NonStrictExpectation,可以進行verification。對于StrictExpectation則沒有必要。在new Verifications(){}中的方法至少被調(diào)用一次。

驗證某個方法沒被調(diào)用

times = 0

驗證順序調(diào)用

普通的new Verifications(){}沒有驗證其中方法的調(diào)用順序。new VerificationsInOrder(){}用來驗證(相對)順序。

驗證部分順序

使用unverifiedInvocations()方法固定不需要驗證的方法的位置。

第一種場景是驗證部分方法的順序,其余方法不需要驗證:

@Test
public void TestMethod(@Mocked final Dependency mock) {
    mock.mockMethod1();
    mock.mockMethod2();
    mock.mockMethod3();
    mock.mockMethod4();

    new VerificationsInOrder(){
        {
            // 下面的代碼會失敗:
            // Unexpected invocation of: Dependency#mockMethod2()
            // 如果兩個方法相連,則其在replay中也必須直接相連
            // unverifiedInvocations();
            // mock.mockMethod1();
            // mock.mockMethod4();
            
            // 成功
            mock.mockMethod1();
            unverifiedInvocations();
            mock.mockMethod4();
        }
    };
}

第二種場景是關心部分方法順序,另一些方法也需要驗證,但是不關心順序。這時需要兩個Verification塊:

@Test
public void TestMethod(@Mocked final Dependency mock) {
    mock.mockMethod1();
    mock.mockMethod2();
    mock.mockMethod3();
    mock.mockMethod4();

    new VerificationsInOrder(){{
            mock.mockMethod1();
            unverifiedInvocations();
            mock.mockMethod4();
    }};

    new Verifications(){{
        mock.mockMethod3();
        mock.mockMethod2();
    }};
}

多個verification塊時,其相對順序會引起比較詭異的事:

@Test
public void TestMethod(@Mocked final Dependency mock) {
    mock.mockMethod1();
    mock.mockMethod2();
    mock.mockMethod3();
    mock.mockMethod4();
    
    //下面的代碼會失敗
    //MissingInvocation: Missing invocation of:Dependency#mockMethod2()
    //顛倒一下兩個verification的順序則會通過
    //原因似乎是Verifications會將驗證過的方法刪除

    new Verifications(){{
        mock.mockMethod3();
        mock.mockMethod2();
    }};

    new VerificationsInOrder(){{
        mock.mockMethod1();
        mock.mockMethod2();
        mock.mockMethod4();
    }};
}

full verification

new FullVerifications() {...}可以保證replay階段調(diào)用的所有方法在verify代碼塊中都有相應的匹配,順序可以不一致。

full verification in order

使用new FullVerificationsInOrder()

限制full verification的目標類型

默認使用full verification時,所有mock類的所有調(diào)用都必須顯式驗證。如果需要限定驗證的類或者實例,使用FullVerifications(xxx.class)或者FullVerifications(mockObject)

驗證沒有調(diào)用發(fā)生

使用空的FullVerifications(xxx.class)或者FullVerifications(mockObject)可以驗證在指定類/實例上沒有調(diào)用方法。但是如果Expectation中有minTimes和times的方法會被正常驗證。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,539評論 19 139
  • JMockit提供了兩套API,一套叫做Expectations,用于基于行為的單元測試;一套叫做Faking,用...
    孫興斌閱讀 1,976評論 0 0
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,939評論 25 709
  • 謹以此文紀念逝去的青春和過往的人,青春萬歲。 我是個懷舊的人,《匆匆那年》看過電影,書讀了兩遍。 再次讀完了《匆匆...
    樂活少女樂閱讀 463評論 2 1
  • 韋應物《寄李儋元錫》原詩、注釋、翻譯、賞析 【原文】:寄李儋元錫韋應物去年花里逢君別,今日花開又一年。世事茫茫難自...
    xcy無名閱讀 458評論 0 1

友情鏈接更多精彩內(nèi)容