如何用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实例。以下是完整实现步骤:
- 添加依赖并配置mock生成:
在pubspec.yaml的dev_dependencies中添加:
mockito: ^5.4.0 build_runner: ^2.4.0
- 创建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 {}
- 运行命令生成mock代码:
flutter pub run build_runner build
- 在测试中使用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
相关产品推荐
相关产品推荐

