首页 > 解决方案 > 未返回预期对象时的 Mockito

问题描述

我正在尝试从模拟方法返回预期值。

TestClass testClass = TestClass.getInstance();
ClassToMock classToMock = Mockito.mock(ClassToMock.class);
testClass.setClassToMock(classToMock);
ExpectedObject expectedObject = new ExpectedObject("1", "2", "3");
when(classToMock.method(ArgumentMatchers.anyString(), ArgumentMatchers.anyBoolean(),
                        ArgumentMatchers.any(A.class), ArgumentMatchers.any(B.class))
                .thenReturn(expectedObject);
testClass.invokeTestMethod();

TestClass 和 invokeTestMethod 如下所示:

public class TestClass {

  private ClassToMock classToMock;

  public void invokeTestMethod() {
     ExpectedObject expectedObj1 = classToMock.method("A", "B", null, null);
     ::
     ::
     ExpectedObject expectedObj2 = classToMock.method("X", "Y", null, null);
     ::
     ::
     ExpectedObject expectedObj3 = classToMock.method("P", "Q", null, null);
     ::
     ::
  }

  public void setClassToMock(ClassToMock ctm) {
     this.classToMock = ctm;
  }
}

我已经在 TestClass 上设置了 classToMock 实例,以确保 TestClass 在模拟实例上工作。

为了使问题更清楚,方法调用发生在模拟对象(classToMock)上,但是预期的返回值(ExpectedObject)没有出现。

标签: javamockito

解决方案


此处的问题:null不匹配any(X.class),因此不会返回模拟值

如果null作为参数传递,那么最后两个参数匹配器就位:

  • ArgumentMatchers.any(A.class)
  • ArgumentMatchers.any(B.class)

将不匹配

请参阅以下文档any(java.lang.Class)

匹配给定类型的任何对象,不包括 nulls。(标记为粗体以强调)

这是因为Mockito 2.1.0在内部尝试评估参数的类型(类)。Andnull是一个空引用,不指向实例化对象。没有对对象的引用,不能评估该对象的任何类:

null instanceOf A // will evaluate to `false`
null instanceOf B // will evaluate to `false`

请参阅在调用 instanceof 之前是否需要进行空检查?

解决方法:使用any()orisNull()来匹配null

要在内部调用模拟方法,请使用将匹配null传递的值的参数匹配器。


推荐阅读