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

如何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 21:45:34