when()如何运作?

时间:2012-10-06 04:00:49

标签: java mocking mockito

在以下示例中

when(myMethod("abc", 123)).thenReturn(456);

when()方法如何在不实际调用myMethod()的情况下捕获方法名称和参数?

我可以编写一个方法来执行与when()相同的操作,这样我就可以获得一个方法指针和一个Object数组作为后来调用的参数吗?

2 个答案:

答案 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(或可能是doAnswerdoThrow)的方法,它为您提供了替换对象,因此永远不会调用原始文件(docs):

doReturn(1).when(mySpiedObject).getSomeInteger(anyString(), eq("seven"));

请注意,Mockito文档建议使用when而非doReturn,因为后者为not type-safe

相关问题