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

如何使用Mockito mock DynamoDB的ItemCollection<QueryOutcome>编写单元测试

Mockito 单元测试实现方案

你需要Mock的核心对象是DynamoDB的Index、可迭代的ItemCollection<QueryOutcome>、Item实例以及Gson实例,具体实现步骤如下:

1. 前置依赖配置

确保你的测试依赖中包含Mockito核心包,如果你用JUnit5,需要引入mockito-junit-jupiter适配包。

2. 完整测试代码示例

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import java.util.List;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;

@ExtendWith(MockitoExtension.class)
public class RecordRepositoryTest {
    // 模拟DynamoDB索引对象
    @Mock
    private Index index;
    // 模拟Gson序列化实例
    @Mock
    private Gson gson;
    // 注入待测试的业务类,你需要替换成你自己的业务类名
    @InjectMocks
    private RecordRepository recordRepository;

    @Test
    public void testQueryRecordsByWorkItemId() {
        // 准备测试参数
        String testWorkItemId = "test-id-123";
        // 模拟两个返回的Item实例
        Item mockItem1 = mock(Item.class);
        Item mockItem2 = mock(Item.class);
        // 模拟ItemCollection,注意它实现了Iterable接口
        ItemCollection<QueryOutcome> mockItemCollection = mock(ItemCollection.class);
        // 模拟序列化后的JSON字符串和对应的Record对象
        String item1Json = "{\"id\":\"1\",\"content\":\"test1\"}";
        String item2Json = "{\"id\":\"2\",\"content\":\"test2\"}";
        Record record1 = new Record();
        record1.setId("1");
        record1.setContent("test1");
        Record record2 = new Record();
        record2.setId("2");
        record2.setContent("test2");

        // 配置Mock行为
        // 1. 当index调用query方法时返回模拟的ItemCollection
        when(index.query(any(QuerySpec.class))).thenReturn(mockItemCollection);
        // 2. 配置ItemCollection的迭代行为,返回包含两个模拟Item的迭代器
        when(mockItemCollection.iterator()).thenReturn(List.of(mockItem1, mockItem2).iterator());
        // 3. 配置Item调用toJSON时返回对应的字符串
        when(mockItem1.toJSON()).thenReturn(item1Json);
        when(mockItem2.toJSON()).thenReturn(item2Json);
        // 4. 配置Gson反序列化行为
        when(gson.fromJson(item1Json, Record.class)).thenReturn(record1);
        when(gson.fromJson(item2Json, Record.class)).thenReturn(record2);

        // 执行待测试方法
        List<Record> result = recordRepository.queryByWorkItemId(testWorkItemId);

        // 校验结果
        assertEquals(2, result.size());
        assertEquals(record1, result.get(0));
        assertEquals(record2, result.get(1));
        // 校验Mock调用是否符合预期
        verify(index, times(1)).query(any(QuerySpec.class));
        verify(mockItem1, times(1)).toJSON();
        verify(mockItem2, times(1)).toJSON();
        verify(gson, times(2)).fromJson(anyString(), eq(Record.class));
    }
}

3. 注意事项

  • 如果你需要严格校验QuerySpec的参数是否符合预期,可以替换any(QuerySpec.class)为自定义参数匹配器,校验表达式、占位符参数是否正确
  • 你贴出的原代码存在变量名笔误:定义的列表是recordsList,返回的是recordList,实际业务代码请修正该问题

内容的提问来源于stack exchange,提问作者Nitika

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 05:45:04