You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 17:57:04