Python 3单元测试中Mock Thread Target失效问题求助
问题分析与解决方案
这个坑我踩过!你遇到的问题核心是Mock的路径不对,Python的导入机制会把模块对象的引用复制到导入它的模块命名空间里,所以你得patch被测试代码实际使用的那个Builder.work引用,而不是原模块里的。
为什么原Mock不生效?
当run_thread.py执行from mymodule import Builder时,run_thread模块内部会生成一个指向mymodule.Builder的本地引用。你在测试里如果直接patchmymodule.Builder.work,只会修改原模块里的方法,但run_thread里的那个本地引用还是指向原来的Builder.work,所以原始代码依然会执行。
正确的Mock方式
你需要patchrun_thread模块里的Builder.work,也就是遵循Mock的**"where it's used"原则**——Mock对象被调用的地方,而不是它定义的地方。
修改后的单元测试示例如下:
import unittest from unittest.mock import patch from ddt import ddt, data, unpack import run_thread # 导入你的目标模块 @ddt class TestRunThread(unittest.TestCase): # 关键:patch的路径是run_thread里的Builder.work @patch('run_thread.Builder.work') def test_run_thread(self, mock_work): # 配置Mock的行为,比如返回值或者抛出异常 mock_work.return_value = None # 如果run_thread里的chunks、a/b/c是外部依赖,也需要Mock # 比如:run_thread.chunks = [1,2,3] # run_thread.a = 'test_a' # ... # 调用要测试的函数 run_thread.run_thread() # 验证Mock是否被正确调用 mock_work.assert_called() # 还可以验证调用参数、次数等 # mock_work.assert_called_with('expected_a', 'expected_b', 'expected_c') # self.assertEqual(mock_work.call_count, 3)
额外注意事项
- 如果你在
run_thread.py里是用import mymodule然后mymodule.Builder.work调用的,那Mock路径就应该是run_thread.mymodule.Builder.work,核心还是看被测试代码里实际引用的路径。 - 确保测试中提前处理
run_thread.py里的依赖变量(比如chunks、a/b/c),避免因为变量未定义导致测试报错。
内容的提问来源于stack exchange,提问作者user1187968
相关产品推荐
相关产品推荐

