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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 18:22:05