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