我正在尝试从模拟方法返回期望值。
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)没有到来。
答案 0 :(得分:1)
null
与any(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方法中的构造函数中传递ClassToMock
或TestClass
。这样,您可以在测试中将模拟传递给测试类,并在方法invokeTestMethod
中使用模拟。目前您尚未执行此操作,因此在真实对象上调用了method
答案 3 :(得分:-1)
感谢所有选择帮助的人。我找到了解决方法。在TestClass中,有一个这样的调用:
ExpectedObject expectedObj1 = classToMock.method("A", "B", null, null);
两个空参数导致了此问题。因此,我使用NON NULL参数使method
内部的ClassToMock
重载了。进行此更改后,模拟程序运行正常。