Mokito多个ArgumentMatchers不生效

1,362 阅读1分钟

Java 单元测试的时候如果在一个mock内 使用多个 ArgumentMatchers ,根据不同参数返回不通结果,按照下面的写法:

  T mock = Mock(T.class);
  when(mock.method(argThat(new ArgumentMatcher<Object>() {
        @Override
        public boolean matches(Object arg0) {
            //比较逻辑1
        }
    }))).thenReturn(result1);

     when(mock.method(argThat(new ArgumentMatcher<Object>() {
        @Override
        public boolean matches(Object arg0) {
            //比较逻辑2
        }
    }))).thenReturn(result2);

     when(mock.method(argThat(new ArgumentMatcher<Object>() {
        @Override
        public boolean matches(Object arg0) {
            //比较逻辑3
        }
    }))).thenReturn(result3);

实际执行单元测试的时候会报java.lang.NullPointerException

解决办法:

    doReturn(result1).when(mock).method(
    argThat(new ArgumentMatcher<Object>() {
          @Override
          public boolean matches(Object argument) {
            ///比较逻1
          }
        }));
        

    doReturn(result2).when(mock).method(
    argThat(new ArgumentMatcher<Object>() {
          @Override
          public boolean matches(Object argument) {
            ///比较逻2
          }
        }));
        
    doReturn(result1).when(mock).method(
    argThat(new ArgumentMatcher<Object>() {
          @Override
          public boolean matches(Object argument) {
            ///比较逻3
          }
        }));

即可正常执行。