简短的答案是,在您的示例中,的结果mock.method()将是类型合适的空值;Mockito通过代理,方法拦截和类的共享实例使用间接方式,MockingProgress以确定对模拟方法的调用是用于存根还是重放现有的存根行为,而不是通过的返回值传递有关存根的信息。一种嘲笑的方法。
几分钟后,对微型代码进行了简短的分析。注意,这是一个非常粗糙的描述-这里有很多细节。我建议您自己检查github上的源代码。
首先,当您使用类的mock方法模拟一个类时Mockito,实际上是这样:
Mockito.mock
将org.mockito.internal.MockitoCore
默认的模拟设置作为参数传递给.mock。- MockitoCore.mock代表
org.mockito.internal.util.MockUtil.createMock
- 本
MockUtil
类使用ClassPathLoader
类来获得的实例MockMaker用于创建模拟。默认情况下,使用CgLibMockMaker
类。 - CgLibMockMaker使用从JMock借用的类,该类ClassImposterizer处理创建模拟。所使用的“魔术的Mockito”键片的MethodInterceptor用于创建模拟:所述的M
ockitoMethodInterceptorFilter
以及MockHandler
实例,包括的实例的链MockHandlerImpl。方法拦截器将调用传递给MockHandlerImpl
实例,该实例实现在对某个模拟调用某个方法时(例如,搜索是否已记录答案,确定该调用是否代表新的存根等)应应用的业务逻辑。默认状态是,如果尚未为正在调用的方法注册存根,则将返回类型合适的空值。
现在,让我们看一下示例中的代码:
when(mock.method()).thenReturn(somevalue)
这是此代码执行的顺序:
mock.method()when(<result of step 1>)<result of step 2>.thenReturn
理解发生了什么的关键是当调用模拟方法上的方法时会发生什么:向方法拦截器传递有关方法调用的信息,并委托给它的
MockHandler实例链,最终将实例委托给
MockHandlerImpl#handle。在期间
MockHandlerImpl#handle,模拟处理程序创建的实例
OngoingStubbingImpl并将其传递给共享MockingProgress实例。
在when调用之后调用该方法时
method(),它将委托给
MockitoCore.when,后者将调用stub()同一类的方法。此方法从
MockingProgress模拟
method()调用写入的共享实例中解压缩正在进行的存根,然后将其返回。然后
thenReturn在
OngoingStubbing实例上调用方法。



