2.9 显式验证

作者: 孙兴斌 | 来源:发表于2016-12-27 17:36 被阅读25次

    对于NonStrictExpectation,可以进行verification。对于StrictExpectation则没有必要。在new Verifications(){}中的方法至少被调用一次。

    验证某个方法没被调用

    times = 0

    验证顺序调用

    普通的new Verifications(){}没有验证其中方法的调用顺序。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阶段调用的所有方法在verify代码块中都有相应的匹配,顺序可以不一致。

    full verification in order

    使用new FullVerificationsInOrder()

    限制full verification的目标类型

    默认使用full verification时,所有mock类的所有调用都必须显式验证。如果需要限定验证的类或者实例,使用FullVerifications(xxx.class)或者FullVerifications(mockObject)

    验证没有调用发生

    使用空的FullVerifications(xxx.class)或者FullVerifications(mockObject)可以验证在指定类/实例上没有调用方法。但是如果Expectation中有minTimes和times的方法会被正常验证。

    相关文章

      网友评论

        本文标题:2.9 显式验证

        本文链接:https://www.haomeiwen.com/subject/ordevttx.html