Flutter测试使用cryptography库报UnimplementedError问题求助
解决Flutter测试中cryptography库ECDH.p256未实现错误的方法
原因分析
Flutter测试环境默认采用纯Dart实现的DartEcdh,但该实现对ECDH算法的newKeyPair方法未做完整适配;而移动端、Web环境会自动切换到平台原生加密实现,因此能正常运行。
解决方案
1. 引入cryptography_flutter适配测试环境
通过指定Flutter平台加密实现替代纯Dart版本:
- 在
pubspec.yaml的dev_dependencies中添加依赖:dev_dependencies: cryptography_flutter: ^2.0.0 # 使用与主库兼容的最新版本 flutter_test: sdk: flutter - 在测试文件初始化时强制切换实现:
import 'package:cryptography/cryptography.dart'; import 'package:cryptography_flutter/cryptography_flutter.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { setUpAll(() { Cryptography.instance = FlutterCryptography.defaultInstance; }); test('生成ECDH P256密钥对', () async { final algorithm = Ecdh.p256(); final keyPair = await algorithm.newKeyPair(); expect(keyPair, isNotNull); // 后续测试逻辑 }); }
2. Mock密钥对生成逻辑
若无需实际加密操作,可Mock相关方法绕过实现:
import 'package:cryptography/cryptography.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mocktail/mocktail.dart'; class MockEcdh extends Mock implements Ecdh {} class MockKeyPair extends Mock implements KeyPair {} void main() { test('验证密钥对生成流程', () async { final mockEcdh = MockEcdh(); final mockKeyPair = MockKeyPair(); when(() => mockEcdh.newKeyPair()).thenAnswer((_) async => mockKeyPair); final keyPair = await mockEcdh.newKeyPair(); expect(keyPair, equals(mockKeyPair)); }); }
3. 启用dart:ffi支持纯Dart实现
部分纯Dart加密实现依赖dart:ffi调用底层库,测试时需开启支持:
- 在测试文件顶部引入:
import 'dart:ffi'; - 运行测试时添加参数:
flutter test --enable-ffi
内容的提问来源于stack exchange,提问作者mah454
相关产品推荐
相关产品推荐

