鉴于以下Mockito语句:
when(mock.method()).thenReturn(someValue);
假设mock.method()语句将返回值传递给when(),Mockito如何为mock创建代理?我想这使用了一些CGLib的东西,但我想知道这是如何在技术上完成的。
简单的回答是,在您的示例中,mock.method()
的结果将是一个适合类型的空值;mockito通过代理、方法拦截和mockingprogress
类的共享实例使用间接操作,以确定对模拟上的方法的调用是用于stubbing或重播现有stubbed行为,而不是通过模拟方法的返回值传递有关stubbing的信息。
在几分钟内对mockito代码进行的一个小型分析如下所示。注意,这是一个非常粗略的描述--这里有大量的play中的细节。我建议你自己去github上查一下源码。
首先,当您使用mockito
类的mock
方法模拟类时,基本上会发生以下情况:
mockito.mock
委托org.mockito.internal.mockitoCore
.mock,将默认模拟设置作为参数传递。mockitocore.mock
委托给org.mockito.internal.util.mockutil
.createMockmockutil
类使用ClasspathLoader
类获取mockmaker
的实例以用于创建模拟。默认情况下,使用CgLibMockMaker类。CGlibMockMaker
使用从JMock借用的类ClassimPosterizer
来处理创建模拟。“mockito magic”的关键部分是用于创建模拟的MethodInterceptor
:mockitoMethodInterceptorFilter
和一系列MockHandler实例,包括一个MockHandlerImpl实例。方法拦截器将调用传递给MockHandlerImpl实例,该实例实现了在模拟上调用方法时应应用的业务逻辑(即,搜索是否已记录了应答,确定调用是否表示新的存根等)。默认状态是,如果尚未为正在调用的方法注册存根,则返回一个适合类型的空值。现在,让我们看看示例中的代码:
when(mock.method()).thenReturn(someValue)
下面是此代码的执行顺序:
mock.method()
当(<步骤1的结果>)
<步骤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进行单元测试。