【发布时间】:2012-10-13 05:36:54
【问题描述】:
在下面的例子中
when(myMethod("abc", 123)).thenReturn(456);
when() 方法如何在不实际调用 myMethod() 的情况下捕获方法名称和参数?
我可以编写一个方法来做与when() 相同的事情,以便获得一个方法指针和一个Objects 数组作为稍后调用的参数吗?
【问题讨论】:
在下面的例子中
when(myMethod("abc", 123)).thenReturn(456);
when() 方法如何在不实际调用 myMethod() 的情况下捕获方法名称和参数?
我可以编写一个方法来做与when() 相同的事情,以便获得一个方法指针和一个Objects 数组作为稍后调用的参数吗?
【问题讨论】:
方法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 将静默丢弃。
但是,您也可以在不是模拟对象而是使用Mockito.spy() 创建的对象上使用when。在这种情况下,该方法实际上会在 when 方法中调用,这通常不是您想要做的。 Mockito 提供了另一种称为doReturn(或者可能是doAnswer 或doThrow)的方法,它为您提供了一个替换对象,因此永远不会调用原始对象(docs):
doReturn(1).when(mySpiedObject).getSomeInteger(anyString(), eq("seven"));
请注意,Mockito 文档建议使用 when 而不是 doReturn,因为后者是 not type-safe。
【讨论】:
when 仍然是首选,原因是最近移至doReturn 方法文档:doReturn 调用没有返回值类型检查。跨度>