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
相关产品推荐
相关产品推荐

