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

如何在单元测试中Mock替换工厂方法创建的ClassA类?

正确Mock工厂方法中的ClassA类

问题根源

你当前的patch目标错了。unittest.mock.patch的核心原则是在哪里使用这个类,就patch哪里的引用。

你的Factory模块从src.something.class_a导入了ClassA,此时Factory内部已经持有了原ClassA的引用。你去patchsrc.something.class_a.ClassA,只会修改原模块里的类,但不会影响Factory里已经导入的那个引用,所以工厂创建的还是原ClassA实例。

解决方案

把patch的目标改成src.factory.ClassA,这样就能替换Factory模块中使用的ClassA引用,工厂创建时就会用你的Mock类。

修改后的test_core.py代码:

import unittest
from unittest.mock import patch

from src.core import Core


class MockClassA:
    def function(self):
        print('I\'m mock class A')


class TestCore(unittest.TestCase):
    # 修改patch的目标路径
    @patch('src.factory.ClassA', new=MockClassA)
    def testOne(self):
        core = Core()
        core.run()

验证效果

运行测试后,输出会变成你预期的:

Ran 1 test in 0.001s

OK

Process finished with exit code 0
I'm mock class A
I'm class C

额外说明

如果后续需要MockClassC或者其他在工厂里直接导入的类,同样遵循这个原则:找到实际使用该类的模块,patch那个模块里的类引用,而不是原类所在的模块。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 05:16:00