Mockito when()调用如何工作?

给出以下Mockito语句:

when(mock.method()).thenReturn(someValue);

考虑到嘲笑方法将返回值传递给when(),Mockito如何为该嘲笑创建代理?我想这会使用一些CGLib的东西,但是有兴趣知道这在技术上是如何完成的。

回答:

简短的答案是,在您的示例中,的结果mock.method()将是类型合适的空值;Mockito通过代理,方法拦截和类的共享实例使用间接方式,MockingProgress以确定对模拟方法的调用是用于存根还是重放现有的存根行为,而不是通过的返回值传递有关存根的信息。一种嘲笑的方法。

几分钟后,对微型代码进行了简短的分析。注意,这是一个非常粗糙的描述-这里有很多细节。我建议您自己检查github上的源代码。

首先,当您使用类的mock方法模拟一个类时Mockito,实际上是这样:

  1. Mockito.mockorg.mockito.internal.MockitoCore默认的模拟设置作为参数传递给.mock。
  2. MockitoCore.mock代表org.mockito.internal.util.MockUtil.createMock
  3. MockUtil类使用ClassPathLoader类来获得的实例MockMaker用于创建模拟。默认情况下,使用CgLibMockMaker类。
  4. CgLibMockMaker使用从JMock借用的类,该类ClassImposterizer处理创建模拟。所使用的“魔术的Mockito”键片的MethodInterceptor用于创建模拟:所述的MockitoMethodInterceptorFilter以及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()调用写入的共享实例中解压缩正在进行的存根,然后将其返回。然后thenReturnOngoingStubbing实例上调用方法。

以上是 Mockito when()调用如何工作? 的全部内容, 来源链接: utcz.com/qa/430366.html

回到顶部