Python Mockito单方法Mock失效问题咨询及解决方法求助
解决Mockito无法Mock直接导入函数的问题
你遇到的核心问题是Python导入机制导致的引用复制:当被测类用from models.crud import get_plane_by_id导入函数时,这个函数的引用会被复制到被测类所在的模块命名空间里。你mock原models.crud模块里的函数,并不会影响被测类里已经持有的那个引用,所以代码还是会调用真实函数。
正确的Mock方式是针对被测类所在模块的函数引用进行Mock,具体操作如下:
方法1:直接Mock被测模块的函数引用
假设你的被测类PersistAircraftEvents在services/aircraft_events.py模块中,代码示例:
from mockito import when, unstub from services.aircraft_events import PersistAircraftEvents def test_persist_event(): # Mock被测模块中的get_plane_by_id when(services.aircraft_events).get_plane_by_id(...).thenReturn(None) # 初始化被测类并执行测试逻辑 db_session = ... # 你的数据库会话实例 service = PersistAircraftEvents(db_session) service.persist_aircraft_event(aircraft_id=456) # 这里添加断言或验证逻辑 # ... # 测试结束后清理Mock unstub()
方法2:用字符串路径指定模块Mock
如果模块路径较长,也可以直接用字符串形式指定被测模块:
from mockito import when, unstub from services.aircraft_events import PersistAircraftEvents def test_persist_event(): when('services.aircraft_events').get_plane_by_id(...).thenReturn(None) # 后续测试逻辑同上 # ... unstub()
关键原理再强调
Python的from X import Y本质是把Y的引用从X模块复制到当前模块,所以原X模块的Y被Mock后,当前模块里的Y还是指向原来的真实函数。只有Mock当前模块里的Y引用,才能让被测代码调用到Mock后的逻辑。
内容的提问来源于stack exchange,提问作者dermoritz
相关产品推荐
相关产品推荐

