4

在下面的例子中

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

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

我可以编写一个方法来做同样的事情,when()以便我得到一个方法指针和一个Objects 数组作为稍后调用的参数吗?

4

2 回答 2

2

该方法myMethod 调用。但它是在模拟对象上调用的——这就是“技巧”。

当然,您可以编写接受“方法指针”(在 Java 中,它将是 class 的对象Method)和一些参数的代码,然后使用invoke,但这样做实际上并没有比myMethod直接调用模拟对象买任何东西。

更常见的when调用如下:

MyObject myObject = mock(MyObject.class);
when(myObject.myMethod("abc", 123)).thenReturn(456);

尝试打印(或记录)表达式

myObject.getClass().getName()

这里。您将看到模拟对象的类实际上不是MyObject. 但它属于具有相同接口的类。对该对象的调用会更新一些内部状态。这允许 Mockito 跟踪它的使用方式,并允许您断言各种事情。

于 2012-10-06T04:11:39.340 回答
0

在你上面的例子中,myMethod是一个模拟对象的方法。没有任何期望,Mockito 将null根据数据类型返回 、 0 或 false ,这when将默默地丢弃。

但是,您也可以when在不是模拟的对象上使用,而是使用Mockito.spy(). 在这种情况下,方法实际上会在when方法中被调用,这通常不是您想要做的。Mockito 提供了另一种称为doReturn(或可能是doAnsweror doThrow)的方法,它为您提供了一个替换对象,因此永远不会调用原始对象(文档):

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

请注意,Mockito 文档推荐使用when而不是doReturn因为后者不是类型安全的

于 2012-10-06T23:56:08.117 回答