当前位置: 首页 > 知识库问答 >
问题:

当()调用时,mockito是如何工作的?

萧宏峻
2023-03-14

鉴于以下Mockito语句:

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

假设mock.method()语句将返回值传递给when(),Mockito如何为mock创建代理?我想这使用了一些CGLib的东西,但我想知道这是如何在技术上完成的。

共有1个答案

黎腾
2023-03-14

简单的回答是,在您的示例中,mock.method()的结果将是一个适合类型的空值;mockito通过代理、方法拦截和mockingprogress类的共享实例使用间接操作,以确定对模拟上的方法的调用是用于stubbing或重播现有stubbed行为,而不是通过模拟方法的返回值传递有关stubbing的信息。

在几分钟内对mockito代码进行的一个小型分析如下所示。注意,这是一个非常粗略的描述--这里有大量的play中的细节。我建议你自己去github上查一下源码。

首先,当您使用mockito类的mock方法模拟类时,基本上会发生以下情况:

  1. mockito.mock委托org.mockito.internal.mockitoCore.mock,将默认模拟设置作为参数传递。
  2. mockitocore.mock委托给org.mockito.internal.util.mockutil.createMock
  3. mockutil类使用ClasspathLoader类获取mockmaker的实例以用于创建模拟。默认情况下,使用CgLibMockMaker类。
  4. CGlibMockMaker使用从JMock借用的类ClassimPosterizer来处理创建模拟。“mockito magic”的关键部分是用于创建模拟的MethodInterceptor:mockitoMethodInterceptorFilter和一系列MockHandler实例,包括一个MockHandlerImpl实例。方法拦截器将调用传递给MockHandlerImpl实例,该实例实现了在模拟上调用方法时应应用的业务逻辑(即,搜索是否已记录了应答,确定调用是否表示新的存根等)。默认状态是,如果尚未为正在调用的方法注册存根,则返回一个适合类型的空值。

现在,让我们看看示例中的代码:

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

下面是此代码的执行顺序:

  1. mock.method()
  2. 当(<步骤1的结果>)
  3. <步骤2的结果>.thenreturn

理解正在发生什么的关键是调用模拟上的方法时发生了什么:方法拦截器被传递有关方法调用的信息,并委托给其mockhandler实例链,这些实例最终委托给mockhandlerImpl#handle。在MockHandlerImpl#Handle期间,模拟处理程序创建OngoingStubbingImpl的实例,并将其传递给共享的MockingProgress实例。

在调用方法()之后调用When方法时,它将委托给mockitocore.When,后者调用同一类的stub()方法。此方法从模拟的方法()调用写入的共享mockingprogress实例中解包正在进行的截尾,并返回它。然后对OngoingStubing实例调用ThenReturn方法。

 类似资料:
  • 问题内容: 给出以下Mockito语句: 考虑到嘲笑方法将返回值传递给when(),Mockito如何为该嘲笑创建代理?我想这会使用一些CGLib的东西,但是有兴趣知道这在技术上是如何完成的。 问题答案: 简短的答案是,在您的示例中,的结果mock.method()将是类型合适的空值;Mockito通过代理,方法拦截和类的共享实例使用间接方式,MockingProgress以确定对模拟方法的调用是

  • Mockito参数匹配器(例如、、、和)的行为与Hamcrest匹配器非常不同。 > Mockito匹配器经常导致InvalidUseOfMatchersException,即使在使用任何匹配器之后很久才执行的代码中也是如此。 Mockito匹配器受制于奇怪的规则,例如,只有当给定方法中的一个参数使用匹配器时,才要求对所有参数使用Mockito匹配器。 Mockito匹配器在重写s或使用等时会导致

  • 当模拟对象中具有相同参数列表的方法返回值时,如果存在冲突语句,我观察到将返回最近的When/thenReturn。因此,下面的陈述将是正确的。 当有冲突语句抛出异常时,行为与上面不一样。例如, 这个测试用例失败了。任何解释都会有帮助。

  • 我完成了一个编程练习,然后我检查了其他人的答案。我发现了一个我面临着难以理解的问题。 这段话是:“给定一串大写字母,例如ABC,返回缺少的字母数。” 我知道reduce从给定的参数中给出了一个int。但是,我不明白当创建了一个新的IntBinaryOperator时,applyAsInt是如何自动工作的。 我读过: http://www.java2s.com/tutorials/java/java

  • https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise 当.then()缺少返回promise对象的适当函数时,处理将继续到链的下一个链接。因此,链可以安全地忽略每个HandlerRejection,直到final.catch()。类似地,.catch()实际上只是一个.the

  • 我想问更多与测试有关的概念性问题。我正在使用Mockitos进行单元测试。