如何在测试中替换类并验证其方法是否被调用?
替换类并验证方法调用的正确实现
你的原代码存在两个核心问题:
- 用
patch("__main__.A", new=B)替换后,mocked_a指向的是B类本身,而some_method是实例方法,直接断言类的方法调用不成立。 - 真实的B类没有被Mock包装,无法追踪实例方法的调用记录。
以下是两种可行的解决方案:
方案1:用Mock模拟B类行为(推荐)
不需要真实执行B类的逻辑,仅验证调用时使用此方案:
from unittest.mock import patch, Mock class A: def some_method(self): print("A") class B: def some_method(self): print("B") def some_function(): a = A() a.some_method() def test_some_function(): # 创建Mock实例,模拟B类的方法签名 mock_b_instance = Mock(spec=B) # 让被替换后的A类返回这个Mock实例 with patch("__main__.A", return_value=mock_b_instance): some_function() # 验证实例的some_method被调用一次 mock_b_instance.some_method.assert_called_once()
方案2:替换为真实B类并追踪方法调用
如果需要真实执行B类的逻辑,同时验证方法调用:
from unittest.mock import patch class A: def some_method(self): print("A") class B: def some_method(self): print("B") def some_function(): a = A() a.some_method() def test_some_function(): # 先将A替换为真实的B类,再给B的some_method打补丁 with patch("__main__.A", new=B), patch.object(B, "some_method") as mocked_method: some_function() # 验证方法被调用一次 mocked_method.assert_called_once()
关键说明
- 方案1的核心是让被替换的A类返回一个Mock实例,这样可以直接追踪实例方法的调用。
- 方案2通过嵌套补丁,先替换类,再对目标类的方法进行Mock,从而在保留真实逻辑的同时记录调用。
内容的提问来源于stack exchange,提问作者Boris Mirzakhanyan
相关产品推荐
相关产品推荐

