2.7 灵活的参数匹配

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

    在record和verify阶段进行方法匹配时,

    • 对于原始类型对象,数值相同即可;
    • 对于Object的子类,需要equals()返回true;
    • 对于数组,需要长度相等且每个对象equals()返回true;

    除此之外,如果不关心replay时的具体参数,可以使用anyXyz或者withXyz(...)方法。

    使用"any"

    @Test
    public void someTestMethod(@Mocked final DependencyAbc abc)
    {
       final DataItem item = new DataItem(...);
    
       new Expectations() {{
          abc.voidMethod(anyString, (List<?>) any);
       }};
    
       new UnitUnderTest().doSomething(item);
    
       new Verifications() {{
          abc.anotherVoidMethod(anyLong);
       }};
    }
    
    • 任何的基本类型都有对应的anyXyzanyString对应任意字符串。
    • any对应任意的对象,在使用时需要进行显式类型转换: (CastClass) any
    • mockit.Invocations类中有可以使用所有anyXyz
    • 使用时参数位置需要一致

    使用"with"

    any的限制太宽松,with可以选择特定的子集。

    @Test
    public void someTestMethod(@Mocked final DependencyAbc abc) {
       final DataItem item = new DataItem(...);
    
       new Expectations() {{
          abc.voidMethod("str", (List<?>) withNotNull());
          abc.stringReturningMethod(withSameInstance(item), withSubstring("xyz"));
       }};
    
       new UnitUnderTest().doSomething(item);
    
       new Verifications() {{
          abc.anotherVoidMethod(withAny(1L));
       }};
    }
    

    也可以自定义with方法。

    使用"null"

    null可以与任何对象匹配,好处是避免类型转换,但是需要有一个any或者with

    @Test
    public void TestMethod(@Mocked final Dependency mock) {
        new StrictExpectations() {{
        
            //测试会失败,因为没有any或者with
            mock.mockMethod(2,  null);
            
            //测试通过
            mock.mockMethod(anyInt,  null);
        }};
        mock.mockMethod(new Integer(2), "hello world");
    }
    

    如何需要的是null,则应该用 withNull() 方法。

    varargs

    要么使用常规的参数,要么使用any/with,不能混合使用。

    相关文章

      网友评论

        本文标题:2.7 灵活的参数匹配

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