Flutter使用network_image_mock测试Image.network时出现类型转换错误
错误原因
- 你当前使用的
mockNetworkImagesFor模拟工具未正确返回图片二进制数据,内部生成的模拟HTTP响应body值为null,在图片解码环节需要将响应内容强转为List<int>时触发了类型转换异常。 - 部分低版本的网络图片模拟工具没有配置空响应兜底逻辑,当你没有为测试中实际用到的图片URL注册对应的模拟返回值时,就会默认返回null触发该报错。
解决方案
方法1:手动注册目标URL的模拟返回值
提前构造一个合法的单像素透明图片二进制数据,针对测试中用到的图片URL配置模拟响应即可,修改后的测试代码如下:
import 'dart:typed_data'; import 'package:flutter_test/flutter_test.dart'; import 'package:http/http.dart' as http; // 预定义的单像素透明PNG二进制数据,可直接通用 final mockImageBytes = Uint8List.fromList([ 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x08, 0x06, 0x00, 0x00, 0x00, 0x1F, 0x15, 0xC4, 0x89, 0x00, 0x00, 0x00, 0x0B, 0x49, 0x44, 0x41, 0x54, 0x08, 0xD7, 0x63, 0xF8, 0x0F, 0x04, 0x00, 0x01, 0x05, 0x01, 0x02, 0x03, 0xCC, 0x82, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82 ]); testWidgets('My new test', (WidgetTester tester) async { mockNetworkImagesFor(() async { // 替换为ScreenWidget中Image.network实际使用的图片URL final imageUrl = Uri.parse('你实际使用的图片地址'); when(http.get(imageUrl)).thenAnswer((_) async => http.Response.bytes(mockImageBytes, 200) ); await tester.pumpWidget( MaterialApp( home: Scaffold( body: ScreenWidget(), ), ), ); final myImageFinder = find.byKey(const Key('TheImageWidget')); expect(myImageFinder, findsOneWidget); }); });
方法2:使用默认兜底的模拟工具
升级network_image_mock到最新版本,新版本默认会对所有未手动配置的图片URL返回通用的模拟图片数据,不需要单独配置每个URL的返回值即可避免该报错。
方法3:跳过图片加载逻辑
如果你的测试不需要验证图片加载相关逻辑,仅需要验证组件是否存在,可以在测试环境下将Image.network替换为占位的Container组件,完全规避网络请求逻辑。
内容的提问来源于stack exchange,提问作者Alexandru Rusu
相关产品推荐
相关产品推荐

