在下面的示例中
when(myMethod("abc", 123)).thenReturn(456);
when()
方法如何在不实际调用myMethod()
的情况下捕获方法名称和参数?
我可以编写一个方法来执行与when()
相同的操作,以便获得方法指针和Object
数组作为稍后调用的参数吗?
myMethod
。 但它是在模拟对象上调用的——这就是"技巧"。
当然,你可以编写接受"方法指针"(在Java中,它将是类Method
的对象)和一些参数的代码,并使用invoke
,但这样做实际上并没有比直接调用模拟对象的myMethod
买任何东西。
更常见的是看到when
调用如下:
MyObject myObject = mock(MyObject.class);
when(myObject.myMethod("abc", 123)).thenReturn(456);
尝试打印(或记录)表达式
myObject.getClass().getName()
这里。 您将看到模拟对象的类实际上并不MyObject
。 但它属于具有相同接口的类。 对此对象的调用会更新一些内部状态。 这使Mockito可以跟踪它的使用方式,并允许您断言各种事情。
在上面的示例中,myMethod
是模拟对象上的方法。没有任何期望,Mockito将根据数据类型返回null
、0或false,when
将静默丢弃这些数据类型。
但是,您也可以在不是模拟的对象上使用when
,而是使用 Mockito.spy()
创建的对象。在这种情况下,该方法实际上将在when
方法中调用,这通常不是您想要执行的操作。Mockito提供了另一种称为doReturn
的方法(也可能是doAnswer
或doThrow
),它为您提供了一个替换对象,因此永远不会调用原始对象(docs):
doReturn(1).when(mySpiedObject).getSomeInteger(anyString(), eq("seven"));
请注意,Mockito 文档建议使用 when
而不是 doReturn
,因为后者不是类型安全的。