在以下示例中
when(myMethod("abc", 123)).thenReturn(456);
when()
方法如何在不实际调用myMethod()
的情况下捕获方法名称和参数?
我可以编写一个方法来执行与when()
相同的操作,这样我就可以获得一个方法指针和一个Object
数组作为后来调用的参数吗?
答案 0 :(得分:2)
调用方法myMethod
。但它是在模拟对象上调用的 - 这就是“技巧”。
当然,您可以编写接受“方法指针”的代码(在Java中,它将是类Method
的对象)和一些参数,并使用invoke
,但这样做不会实际上通过直接调用模拟对象的myMethod
来购买任何东西。
更常见的是when
调用如下:
MyObject myObject = mock(MyObject.class);
when(myObject.myMethod("abc", 123)).thenReturn(456);
尝试打印(或记录)表达式
myObject.getClass().getName()
这里。您将看到模拟对象的类实际上不是MyObject
。但它是一个具有相同界面的类。对此对象的调用更新了一些内部状态。这允许Mockito跟踪它的使用方式,并允许您断言各种事物。
答案 1 :(得分:0)
在上面的示例中,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
,因为后者为not type-safe。