when() 如何工作



在下面的示例中

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

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

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

相关内容

  • 没有找到相关文章

最新更新