如何在单元测试中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
相关产品推荐
相关产品推荐

