嘲讽在引擎盖下如何工作



我知道我真的不需要知道Mockito如何在引擎盖下完成所有操作以便能够使用它,但是这已经使我困惑了一段时间我很想知道它。有几种Mockito方法,我无法理解它们如何工作。一个很好的例子是:

OngoingStubbing<T> Mockito.when(T methodCall)

您可以使用它来做以下操作:

Object mockedObject = Mockito.mock(Object.class);
Mockito.when(mockedObject.toString()).thenReturn("super cool string");
System.out.println(mockedObject.toString());

此代码将提供输出:

super cool string

我了解如何使用此方法,但我不明白这可能是如何工作的。当我们知道我们关注的模拟对象和方法时,如何了解Mockito?据我所知,我们没有传递模拟物体,我们将传递给overedobject.tostring(),这是类型字符串的值。我很确定,在设置所有"/theTreturn"的东西之前,MockedObject.toString()只是返回null。那么为什么这与这样做不一样:

Object mockedObject = Mockito.mock(Object.class);
mockedObject.toString();
Mockito.when(null).thenReturn("super cool string");
System.out.println(mockedObject.toString());

显然,第二个代码段没有任何意义,但似乎两个代码段应该在功能上等效。

编辑:两个代码段实际上相同的。在下面查看我对自己问题的回答。

doh!

我想我应该在发布此问题之前实际上尝试运行示例代码。

事实证明,两个代码段实际上等效的。我只是以为他们不是。

这个启示阐明了嘲笑的方式。

我现在最好的猜测是,当模拟模拟对象时,新创建的Object.toString()记录了一个.toString()方法的新创建的一部分(无论如何都必须这样做才能获得Mockito。验证()工作)。然后,它必须将此调用记录到某种线程本地静态变量中的模拟方法。然后,当我何时调用()时,它实际上忽略了输入值(可能使用其类型?匹配该签名的方法调用)。最后称为哪种方法是它决定修改的方法。

当然,这只是我的猜测,这是根据我观察到的莫科托的功能的方式。实际实现可能是不同的,但这至少是有道理的。

相关内容

  • 没有找到相关文章

最新更新