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

如何用http.testing或Mockito模拟返回StreamedResponse的HTTP请求?

模拟返回StreamedResponse的HTTP请求

方法一:使用http.testing库的MockClient.streaming

MockClient.streaming的回调函数需返回Future<StreamedResponse>,你可以通过构造包含响应内容的字节流来生成目标响应,示例代码如下:

import 'dart:convert';
import 'dart:typed_data';
import 'package:http/http.dart' as http;
import 'package:http/testing.dart';

var mockClient = MockClient.streaming((request, bodyStream) async {
  // 根据请求路径返回对应响应
  if (request.url.path != "/data.json") {
    return http.StreamedResponse(
      Stream.empty(),
      404,
      headers: {'content-type': 'application/json'},
    );
  }

  // 将JSON数据转为字节流
  final responseData = json.encode({'numbers': [1, 4, 15, 19, 214]});
  final byteStream = Stream.value(Uint8List.fromList(responseData.codeUnits));

  // 返回200状态的StreamedResponse
  return http.StreamedResponse(
    byteStream,
    200,
    headers: {'content-type': 'application/json'},
  );
});

方法二:使用Mockito正确模拟send方法

你之前的代码未生效,核心原因是未正确生成http.Client的mock类,或未构造有效的StreamedResponse实例。以下是完整实现步骤:

  1. 添加依赖并配置mock生成:
    在pubspec.yaml的dev_dependencies中添加:
mockito: ^5.4.0
build_runner: ^2.4.0
  1. 创建mock类文件(如mock_http_client.dart):
import 'package:http/http.dart' as http;
import 'package:mockito/mockito.dart';

// 定义http.Client的mock类
class MockHttpClient extends Mock implements http.Client {}
  1. 运行命令生成mock代码:
flutter pub run build_runner build
  1. 在测试中使用mock并返回正确响应:
import 'dart:convert';
import 'dart:typed_data';
import 'package:http/http.dart' as http;
import 'package:test/test.dart';
import 'mock_http_client.dart';

void main() {
  test('测试send方法返回StreamedResponse', () async {
    final mockClient = MockHttpClient();

    // 构造测试用的StreamedResponse
    final responseData = json.encode({'numbers': [1, 4, 15, 19, 214]});
    final byteStream = Stream.value(Uint8List.fromList(responseData.codeUnits));
    final mockResponse = http.StreamedResponse(
      byteStream,
      200,
      headers: {'content-type': 'application/json'},
    );

    // 监听send方法调用,返回mock响应
    when(mockClient.send(any)).thenAnswer((_) async => mockResponse);

    // 执行测试逻辑
    final request = http.Request('GET', Uri.parse('https://example.com/data.json'));
    final response = await mockClient.send(request);

    // 验证结果
    expect(response.statusCode, 200);
    final responseBody = await response.stream.bytesToString();
    expect(json.decode(responseBody), {'numbers': [1, 4, 15, 19, 214]});
  });
}

注意:无需自定义MockStreamedResponse,直接使用http库自带的StreamedResponse构造函数,传入正确的字节流、状态码和headers即可生成可用的模拟响应。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 06:25:33