如何Mock Azure PagedIterable<T> 模拟TableClient做单元测试
Mock Azure TableClient返回PagedIterable实现方法
你可以根据自己的测试场景选以下两种方式实现,不需要引入额外的测试依赖。
方案1:构造真实PagedIterable实例(推荐)
这种方式不需要全量Mock PagedIterable的所有遍历方法,不会因为漏打桩iterator、stream等方法导致空指针,稳定性更好。
- 先准备你需要的测试用
TableEntity数据
// 构造测试用表实体 TableEntity tagEntity1 = new TableEntity("tagPartition", "001") .addProperty("TagName", "Environment") .addProperty("TagValue", "Prod"); TableEntity tagEntity2 = new TableEntity("tagPartition", "002") .addProperty("TagName", "Service") .addProperty("TagValue", "Order"); List<TableEntity> testEntityList = List.of(tagEntity1, tagEntity2);
- 实现一个简单的
PagedResponse包装测试数据,再传入PagedIterable构造方法得到真实实例
import com.azure.core.http.rest.PagedResponse; import com.azure.core.http.rest.PagedIterable; import com.azure.core.http.HttpHeaders; import java.util.stream.Stream; // 构造单页测试响应 PagedResponse<TableEntity> testPage = new PagedResponse<>() { @Override public int getStatusCode() { return 200; } @Override public HttpHeaders getHeaders() { return new HttpHeaders(); } @Override public String getContinuationToken() { // 单页测试数据不需要续传token,返回null即可 return null; } @Override public List<TableEntity> getValue() { return testEntityList; } }; // 构造真实的PagedIterable实例 PagedIterable<TableEntity> testPagedIterable = new PagedIterable<>(() -> Stream.of(testPage));
- 完成
TableClient和TableServiceClient的打桩
@Mock private TableServiceClient tableServiceClient; @Mock private TableClient tableClient; @BeforeEach void setUp() { MockitoAnnotations.openMocks(this); // 打桩表客户端获取逻辑 when(tableServiceClient.getTableClient(anyString())).thenReturn(tableClient); // 打桩listEntities返回我们构造的测试实例 when(tableClient.listEntities(any(ListEntitiesOptions.class), any(), any())) .thenReturn(testPagedIterable); }
方案2:直接Mock PagedIterable实例
如果你只需要简单遍历逻辑,不想额外实现PagedResponse接口,可以直接Mock PagedIterable的遍历相关方法:
- 准备测试实体列表,Mock PagedIterable的遍历方法
// 准备测试实体列表 List<TableEntity> testEntityList = buildTestEntities(); // Mock PagedIterable实例 PagedIterable<TableEntity> mockPaged = mock(PagedIterable.class); // 打桩迭代器方法,支持for-each遍历 when(mockPaged.iterator()).thenReturn(testEntityList.iterator()); // 如果你的业务代码用了stream()遍历,补充这行打桩 when(mockPaged.stream()).thenReturn(testEntityList.stream()); // 如果用了streamByPage()等分页方法,按需补充对应打桩即可
- 完成TableClient打桩
when(tableClient.listEntities(any(ListEntitiesOptions.class), any(), any())) .thenReturn(mockPaged);
注意:打桩
listEntities方法时,最后两个参数(Duration、Context)你的业务代码传的是null,不要用具体值匹配,用any()做参数匹配即可,避免因参数匹配失败导致打桩不生效。
内容的提问来源于stack exchange,提问作者PoorInRichfield
相关产品推荐
相关产品推荐

