You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 08:12:39