Python单元测试中被mock的对象构造函数仍被调用该如何解决?
问题解答
认知正误判断
你的原有认知是错误的。你当前仅patch了SomeAuthorizer的is_authorized实例方法,类本身没有被mock替换,代码执行到authorizer = SomeAuthorizer()时仍然会调用真实的__init__构造函数,触发依赖环境变量的第三方客户端初始化逻辑,因此未配置对应环境的开发者运行测试会报错。
解决方案
推荐按优先级选择以下方案:
方案1:直接Mock整个
SomeAuthorizer类(最常用,适配性最高)
注意需遵循「patch使用处,而非定义处」的规则,即如果你在some_handler.py中是通过from some_authorizer import SomeAuthorizer引入的类,就需要patchsome_handler.SomeAuthorizer,示例代码如下:from unittest.mock import patch @patch("some_handler.SomeAuthorizer") def test_authorization_request_not_authorized(self, mock_authorizer_cls): # 配置Mock类生成的实例的is_authorized返回值 mock_authorizer = mock_authorizer_cls.return_value mock_authorizer.is_authorized.return_value = False response = handle_request(test_event("test_user", "testing")) assert response == status_code(200, False)该方案下
SomeAuthorizer会被完全替换为Mock对象,实例化时不会执行真实的构造函数逻辑,无需依赖本地环境变量。方案2:同时Mock构造函数和目标方法(仅适合临时快速修改场景)
如果你不想修改现有逻辑仅mock方法,可以额外把__init__方法mock为无操作逻辑:from unittest.mock import patch @patch.object(SomeAuthorizer, "__init__", return_value=None) @patch.object(SomeAuthorizer, "is_authorized", return_value=False) def test_authorization_request_not_authorized(self, mock_is_authorized, mock_init): response = handle_request(test_event("test_user", "testing")) assert response == status_code(200, False)
内容的提问来源于stack exchange,提问作者CustardBun
相关产品推荐
相关产品推荐

