代码之家  ›  专栏  ›  技术社区  ›  GhostCat

为什么Mockito在访问一个mock的同时验证另一个mock时抛出?

  •  0
  • GhostCat  · 技术社区  · 5 年前

    请参见以下示例:

    class Foo { }
    
    class Bar {
        void takeIt(int i, String arg) { System.out.println(arg + i); }
    }
    
    public class Mcve {    
        @Test
        public void passes() {
            Foo foo = Mockito.mock(Foo.class);
            Bar bar = Mockito.mock(Bar.class);
            bar.takeIt(42, "surprise: " + foo);
            String substring = "surprise: " + foo;
            Mockito.verify(bar).takeIt(ArgumentMatchers.eq(42),
                    ArgumentMatchers.contains(substring));
        }
    
        @Test
        public void fails() {
            Foo foo = Mockito.mock(Foo.class);
            Bar bar = Mockito.mock(Bar.class);
            bar.takeIt(42, "surprise: " + foo);
            Mockito.verify(bar).takeIt(ArgumentMatchers.eq(42),
                    ArgumentMatchers.contains("surprise: " + foo));
        }    
    }
    

    这两个测试几乎相同,唯一的区别是:用于 contains() passes() ,但内联 fails()

    失败()

    org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
    Invalid use of argument matchers!
    0 matchers expected, 1 recorded:
    -> at com.ibm.hwmca.z.svm.zhyp.managed.Mcve.fails(Mcve.java:43)
    
    This exception may occur if matchers are combined with raw values:
        //incorrect:
        someMethod(anyObject(), "raw String");
    When using matchers, all arguments have to be provided by matchers.
    For example:
        //correct:
        someMethod(anyObject(), eq("String by matcher"));
    
    For more info see javadoc for Matchers class.
    
    
        at java.lang.String.valueOf(String.java:2994)
        at java.lang.StringBuilder.append(StringBuilder.java:131)
        at Mcve.fails(Mcve.java:43)
    ...
    

    更有趣的是:只有一个以上的参数匹配时才会失败(如果一个参数删除了 int 参数来自 gimme()

    有人能解释一下这里到底发生了什么吗?有没有办法做这样的匹配 contains("surprise: " + foo) foo 被莫基托嘲笑?


    当然,这真的是MCVE的意思。我花了3个小时从我们环境中失败的单元测试到这里的示例。

    Foo对象表示一些由假持久层创建的“数据实体”。我必须验证产品代码是否记录特定的信息,其中一些信息是从伪造的数据对象中派生出来的。

    0 回复  |  直到 5 年前
    推荐文章