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

Python单元测试中Mock目标类未生效的问题排查请求

解决Python Mock未替换目标类的问题

你的问题核心是mock路径选择错误——Python的unittest.mock.patch需要替换的是被测试代码实际使用的那个模块中的类引用,而非原类所在的模块。

为什么你的Mock没生效?

当ClassToTest执行from x.y import ToMock时,它会把ToMock类复制到a.b模块的命名空间中。之后ClassToTest.__init__里创建的self.obj = ToMock(),调用的是a.b模块里的这个ToMock引用,而非x.y里的原类。你之前mock的是x.y.ToMock,自然不会影响到a.b里的这个本地引用。

正确的解决方案

你需要mock的是a.b.ToMock,也就是被测试类所在模块中的那个ToMock引用。

修正后的测试代码

import unittest
from unittest import mock
from a.b import ClassToTest

class TestObject(unittest.TestCase):
    def test_return_stuff(self):
        # 重点:mock被测试类所在模块中的ToMock引用
        with mock.patch('a.b.ToMock') as mock_obj:
            # 配置Mock对象的方法返回值
            mock_obj.return_value.getSomething.return_value = "mocked return value"
            # 初始化被测试类,此时会使用Mock版本的ToMock
            self.test_class = ClassToTest()
            # 调用方法并验证结果是否符合预期
            result = self.test_class.returnStuff()
            self.assertEqual(result, "mocked return value")
            # 验证Mock的方法确实被调用了一次
            mock_obj.return_value.getSomething.assert_called_once_with()

额外的小建议

  • 尽量把测试逻辑放在单独的测试方法(比如上面的test_return_stuff)里,而非setUp,因为setUp会在每个测试方法执行前运行,可能破坏测试的隔离性。
  • 记住一个核心原则:mock被测试代码实际引用的那个位置,而不是原类的定义位置,这是避免mock失效的关键。

内容的提问来源于stack exchange,提问作者GreNait

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 09:53:12