2017-02-27 39 views
0

我知道我并不需要知道Mockito如何在引擎盖下进行所有操作,以便能够使用它,但是这让我困惑不已,任何我很好奇的理解它。有几种Mockito方法,我不明白他们可能如何工作。一个很好的例子是:Mockito.when如何在引擎盖下工作

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.When如何知道我们所关心的模拟对象和方法?据我所知,我们没有传入mockedObject,我们传递了一个类型为String的值mockedObject.toString()。我很确定,在设置所有“when/thenReturn”之前,mockedObject.toString()只返回null。那么,为什么不在这一样做:

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

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

编辑: 这两个代码段实际上是都是是一样的。请参阅我的回答以下我自己的问题。

+0

这是发布问题后发现的一个经典案例。看到我的回答在 – NateW

+0

以下https://stackoverflow.com/questions/14440270/how-does-mockito-when-invocation-work –

回答

0

Doh!

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

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

这个启示揭示了如何在引擎盖下实现Mockito.when。

我现在最好的猜测是,当mockedObject被模拟时,Object.toString()的新创建实现的一部分记录了.toString()方法被调用(为了获得Mockito,必须完成此操作.verify()工作)。然后它必须在某种线程本地静态变量中将此调用记录到模拟方法中。然后,当我调用when()时,它实际上忽略了输入值(除了可能使用它的类型?),然后搜索最近在该线程中存在的任何模拟对象上调用的任何mocked方法(或者只有方法调用匹配该签名)。无论上次调用什么方法,都是它决定修改的方法。

这当然只是我的猜测,基于我如何观察mockito的功能。实际的实施可能不同,但这至少是有道理的。

相关问题