Mockito when()调用如何工作?
给出以下Mockito语句:
when(mock.method()).thenReturn(someValue);
考虑到嘲笑方法将返回值传递给when(),Mockito如何为该嘲笑创建代理?我想这会使用一些CGLib的东西,但是有兴趣知道这在技术上是如何完成的。
回答:
简短的答案是,在您的示例中,的结果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
实例上调用方法。
以上是 Mockito when()调用如何工作? 的全部内容, 来源链接: utcz.com/qa/430366.html