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

如何创建Mock响应以模拟调用外部API时的Socket Timeout异常?

能否通过Mock响应重现/模拟Socket Timeout异常?

完全可以。Socket Timeout本质是客户端在指定时间内未收到服务端响应(或连接未建立完成)触发的异常,你可以通过以下几种常见方式模拟:

1. 直接Mock客户端方法抛出异常

如果你的代码依赖封装好的API客户端类,直接用Mock框架让它在调用时抛出SocketTimeoutException即可。比如Mockito的Java示例:

// 初始化Mock客户端
ExternalApiClient mockApiClient = Mockito.mock(ExternalApiClient.class);

// 配置调用指定方法时抛出超时异常
Mockito.when(mockApiClient.fetchData(Mockito.any()))
       .thenThrow(new SocketTimeoutException("模拟API请求Socket超时"));

// 后续测试代码调用这个Mock客户端,就能触发超时异常

其他语言逻辑类似,比如Python用unittest.mock让Mock对象抛出socket.timeout。

2. 用Mock服务器设置延迟响应

如果需要贴近真实请求场景(模拟服务端迟迟不响应),可以用Mock服务器工具配置超长延迟,超过客户端设置的超时阈值。比如WireMock的示例:

// 配置Mock服务器对指定接口返回延迟响应
stubFor(get(urlEqualTo("/user/data"))
        .willReturn(aResponse()
                .withFixedDelay(6000) // 设置6秒延迟,假设客户端超时配置是5秒
                .withStatus(200)));

当客户端请求这个接口时,因等待时间超过自身超时设置,就会触发Socket Timeout异常。

3. 自定义Mock客户端实现

如果不用框架,也可以自己写一个Mock客户端类,在方法里直接抛出超时异常,或者模拟等待超时:

public class MockExternalApi implements ExternalApi {
    @Override
    public ApiResponse getResource(Request req) throws IOException {
        // 方式一:直接抛出异常
        throw new SocketTimeoutException("模拟Socket超时");
        
        // 方式二:模拟等待直到超时(需确保客户端超时时间短于这个等待时间)
        // try {
        //     Thread.sleep(6000);
        // } catch (InterruptedException e) {
        //     Thread.currentThread().interrupt();
        // }
        // throw new SocketTimeoutException("模拟Socket超时");
    }
}

注意事项

  • 模拟时要确保客户端的超时配置和Mock逻辑匹配,比如客户端设置5秒超时,Mock的延迟就要大于5秒,才能准确触发异常。
  • 不同场景选不同方式:仅验证异常处理逻辑,直接Mock抛出异常最快捷;要模拟真实网络超时场景,用Mock服务器设置延迟更合适。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 05:46:11