在同一个模拟上使用多个ArgumentMatchers

end*_*ess 13 java mockito

我试图在Mock上使用Mockito:
当使用argument1调用Mock.someMethod(..)时 - >返回result1
当使用argument2调用Mock.someMethod(..)时 - >返回result2
当Mock.someMethod使用argument3 - > return result3调用(..)

    when(mock.method(Matchers.argThat(new MyMatcher1() {

        @Override
        public boolean matches(Object arg0) {
                   // comparision logic
        }
    }))).thenReturn(result1);

    when(mock.method(Matchers.argThat(new MyMatcher2() {

        @Override
        public boolean matches(Object arg0) {
                   // comparision logic
        }
    }))).thenReturn(result2);

    when(mock.method(Matchers.argThat(new MyMatcher3() {

        @Override
        public boolean matches(Object arg0) {
                   // comparision logic
        }
    }))).thenReturn(result3);
Run Code Online (Sandbox Code Playgroud)

但是Mockito正确地存储了第一个,但是在第二个上它会抛出NullPointer异常,因为它出于某种原因试图运行带有null agrument的Matcher.我不确定它是否得到支持.

如果这不是正确的方法,如何用Mockito实现这一目标?谢谢.

Daw*_*ica 20

而不是写作

when(mock.method(Matchers.argThat(new MyMatcher1() {
    @Override
    public boolean matches(Object arg0) {
           // comparison logic
    }
}))).thenReturn(result1);
Run Code Online (Sandbox Code Playgroud)

试试这个.

doReturn(result1).when(mock).method(Matchers.argThat(new MyMatcher1() {

    @Override
    public boolean matches(Object arg0) {
               // comparison logic
    }
}));
Run Code Online (Sandbox Code Playgroud)

同样的result2result3.

这在http://docs.mockito.googlecode.com/hg/latest/org/mockito/Mockito.html#12中有描述,但在我看来,文档不清楚这个结构实际上是否需要这个案件.我将与Mockito团队的其他成员讨论如何改进文档.

祝好运.

  • 这是一个工作链接 https://static.javadoc.io/org.mockito/mockito-core/2.15.0/org/mockito/Mockito.html#12 (2认同)

end*_*ess 2

我现在可以通过在自定义 ArgumentMatcher 中进行空检查来解决这个问题。它起作用了,因为 NPE 仅在启动期间 Mockito 调用 when() 语句时出现。此时它甚至不应该调用 ArgumentMatcher.matches()!感觉就像 Mockito 中的一个错误。