不返回预期对象时的Mockito

时间:2020-04-12 12:27:45

标签: java 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)没有到来。

4 个答案:

答案 0 :(得分:1)

问题在这里:nullany(X.class)不匹配,因此不会返回模拟值

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

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

将不匹配

请参阅any(java.lang.Class)的文档:

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

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

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

请参见Is null check needed before calling instanceof?

解决方案:使用any()isNull()来匹配null

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

答案 1 :(得分:0)

在第一个摘录中,以方法签名(String,bool,A,B)作为参数调用方法,而在第二个摘录中,以签名(String,String,Object,Object)调用方法。 因此,在第二个摘录中,classToMock.method(“ A”,“ B”,null,null)返回null。

答案 2 :(得分:0)

例如,您需要在set方法中的构造函数中传递ClassToMockTestClass。这样,您可以在测试中将模拟传递给测试类,并在方法invokeTestMethod中使用模拟。目前您尚未执行此操作,因此在真实对象上调用了method

答案 3 :(得分:-1)

感谢所有选择帮助的人。我找到了解决方法。在TestClass中,有一个这样的调用: ExpectedObject expectedObj1 = classToMock.method("A", "B", null, null); 两个空参数导致了此问题。因此,我使用NON NULL参数使method内部的ClassToMock重载了。进行此更改后,模拟程序运行正常。