Python单元测试如何mock外部DynamoDB客户端并验证query调用
问题原因
- 多余引入了
boto3.client的mock,你的自研代码通过get_aws_client获取DynamoDB客户端,完全不需要直接mock boto3,多余的mock反而导致逻辑混乱 - 参数对应顺序错误:
@mock.patch装饰器的参数顺序是从下往上对应测试函数的入参,你现在的写法里get_aws_client_mock对应上层的x.y.common.get_aws_client,mock_client对应下层的boto3.client,逻辑完全错位 - 核心错误:你把
get_aws_client的返回值设成了mock的boto3.client函数,而boto3.client本身是需要调用才会返回客户端实例的,你直接返回函数对象,后续调用query自然会报错
解决方案
直接mockx.y.common.get_aws_client的返回值为带query方法的Mock对象即可,正确测试代码如下:
import unittest from unittest import mock # 注意替换下面的导入路径为你实际的enclosingClass所在的模块路径 from your_module import enclosingClass @mock.patch("x.y.common.get_aws_client") def test_hello_world_task(get_aws_client_mock): # 1. 构造mock的DynamoDB客户端对象 mock_ddb_client = mock.MagicMock() # 2. 给query方法设置你需要的返回值,这里按你需求设为None mock_ddb_client.query.return_value = None # 3. 让get_aws_client返回我们构造的mock客户端 get_aws_client_mock.return_value = mock_ddb_client # 调用测试方法 enclosingClass.enclosing_function() # 可选:加断言验证调用符合预期 get_aws_client_mock.assert_called_once_with('dynamodb', assume_role_arn=mock.ANY) mock_ddb_client.query.assert_called_once()
内容的提问来源于stack exchange,提问作者A007
相关产品推荐
相关产品推荐

