Python使用Mockito mock open()时如何忽略非预期调用?
解决Mockito模拟open()时忽略非预期调用的问题
出现这个错误是因为测试过程中,除了你业务代码里的open('oneWay_matchDict.pkl', 'rb'),还有其他代码(比如示例中的doctest模块)调用了open读取其他文件,而Mockito默认的严格模式会检查所有调用是否有对应的Stub定义,因此抛出非预期调用的错误。
你可以通过以下方式解决:
方法一:添加通用Stub匹配所有非预期调用
先定义你需要精确匹配的特定open调用,再添加一个匹配任意参数的通用Stub,让所有非预期的open调用都返回一个空Mock对象,这样就不会触发错误:
from mockito import mock, when2, any # 创建你需要的特定Mock文件对象 pkl_file = mock() # 先Stub你关心的精确调用 when2(open, 'oneWay_matchDict.pkl', 'rb').thenReturn(pkl_file) # 添加通用Stub,匹配所有其他open调用 when2(open, any(), any()).thenReturn(mock())
注意Stub的顺序很重要:先定义精确匹配的规则,再定义通用规则,Mockito会按顺序匹配调用,优先使用精确匹配的Stub。
补充:按需校验调用
如果你在测试中需要校验open的调用情况,只需要针对你关心的调用做验证,不要对open执行全量的无剩余调用校验:
from mockito import verify # 只验证你关心的open调用是否执行过 verify(open, times=1)('oneWay_matchDict.pkl', 'rb') # 避免调用verifyNoMoreInteractions(open)
内容的提问来源于stack exchange,提问作者user3273814
相关产品推荐
相关产品推荐

