Mockito如何在指定测试中验证@BeforeClass全局Mock的调用?
解决全局Mock的
verify(..., never())校验问题 我太懂这种尴尬了——用@BeforeClass创建的全局Mock被其他测试用例调用后,单个测试里想验证它从未被调用,结果因为之前测试的调用记录残留,verify(someClassMock, never())总是失败,又不想把全局Mock改成每个测试都初始化的@Before(毕竟全局初始化能节省时间)。
给你两个精准的解决方案,不用改动全局Mock的创建方式:
方案1:用Mockito.clearInvocations()清除调用记录(推荐)
这个方法是专门用来只清除Mock的调用历史,保留你之前设置的存根(stub)行为的,完全适配你的场景。
修改你的测试方法如下:
@Test public void oneOfTheManytest(){ // 关键:清空全局Mock之前所有的调用记录,存根规则保持不变 Mockito.clearInvocations(someClassMock); // 执行本测试的业务逻辑(这里确保没有调用someClassMock.aMethodCall) // 现在校验的就只是本测试执行期间的调用情况了 verify(someClassMock, never()).aMethodCall(any()); }
为什么推荐这个?因为它不会影响你在@BeforeClass里设置的when(someClassMock.aMethodCall(any()).thenReturn(true)),只是把其他测试留下的调用痕迹擦干净,让当前测试的校验只关注自己的执行过程。
方案2:用Mockito.reset()重置Mock(适合需要重新配置存根的场景)
如果某个测试需要临时改变Mock的存根行为,同时清除调用记录,可以用reset()方法。但注意:reset()会清空存根和调用记录,所以需要重新设置你需要的存根规则:
@Test public void anotherTest(){ // 重置Mock,清空所有存根和调用记录 Mockito.reset(someClassMock); // 重新设置当前测试需要的存根 when(someClassMock.aMethodCall(any()).thenReturn(true)); // 执行业务逻辑 verify(someClassMock, never()).aMethodCall(any()); }
这个方案的灵活性更高,但需要额外重新设置存根,如果你不需要改动存根的话,方案1更高效。
小提示
- 如果你有多个全局Mock需要清除调用记录,可以把它们都传给
clearInvocations,比如Mockito.clearInvocations(mock1, mock2, mock3); - 这两个方法都是Mockito核心API,不需要额外依赖,直接用就行。
内容的提问来源于stack exchange,提问作者dipamchang
相关产品推荐
相关产品推荐

