如何使用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
相关产品推荐
相关产品推荐

