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

如何在Dart中对AppInfoHelper类进行单元测试并Mock内部方法

解决方案

首先,你需要稍微改造原类,让getPackageInfo()方法能够被重写(Dart中默认方法支持重写,只要不是final或static修饰,你的原类已经满足这个条件),这样就能在测试中替换它的实现。

步骤1:准备Mock类

使用mockito创建一个继承自AppInfoHelper的Mock类,用来StubgetPackageInfo()方法:

import 'package:mockito/mockito.dart';
import 'package:package_info_plus/package_info_plus.dart';

class MockAppInfoHelper extends Mock implements AppInfoHelper {
  @override
  Future<PackageInfo> getPackageInfo() async {
    return super.noSuchMethod(Invocation.method(#getPackageInfo, []), returnValue: Future.value(PackageInfo()));
  }
}

或者使用mockito的代码生成功能(推荐),在test目录下创建mock_app_info_helper.dart,添加注解:

import 'package:mockito/mockito.dart';
import 'package:package_info_plus/package_info_plus.dart';
import 'your_app_info_helper_path.dart';

@GenerateMocks([AppInfoHelper], customMocks: [
  MockSpec<AppInfoHelper>(onMissingStub: OnMissingStub.returnDefault),
])
void main() {}

运行flutter pub run build_runner build生成mock类。

步骤2:编写单元测试

在测试文件中,初始化Mock类,StubgetPackageInfo()返回预设的PackageInfo实例,然后验证各个方法的返回值是否符合预期:

import 'package:test/test.dart';
import 'package:mockito/mockito.dart';
import 'package:package_info_plus/package_info_plus.dart';
import 'your_app_info_helper_path.dart';
import 'mock_app_info_helper.dart';

void main() {
  late MockAppInfoHelper mockAppInfoHelper;
  late PackageInfo mockPackageInfo;

  setUp(() {
    mockAppInfoHelper = MockAppInfoHelper();
    // 预设模拟的PackageInfo数据
    mockPackageInfo = PackageInfo(
      appName: 'TestApp',
      version: '1.0.0',
      buildNumber: '100',
      packageName: 'com.test.app',
      buildSignature: '',
    );
    // Stub getPackageInfo方法,返回预设的mockPackageInfo
    when(mockAppInfoHelper.getPackageInfo()).thenAnswer((_) async => mockPackageInfo);
  });

  test('getAppName应返回预设的应用名称', () async {
    final result = await mockAppInfoHelper.getAppName();
    expect(result, 'TestApp');
    // 验证getPackageInfo被调用了一次
    verify(mockAppInfoHelper.getPackageInfo()).called(1);
  });

  test('getAppVersion应返回预设的版本号', () async {
    final result = await mockAppInfoHelper.getAppVersion();
    expect(result, '1.0.0');
    verify(mockAppInfoHelper.getPackageInfo()).called(1);
  });

  test('getBuildNumber应返回预设的构建号', () async {
    final result = await mockAppInfoHelper.getBuildNumber();
    expect(result, '100');
    verify(mockAppInfoHelper.getPackageInfo()).called(1);
  });
}

替代方案:使用Spy(Dart mockito 5+支持)

如果你使用的是mockito 5及以上版本,已经支持Spy功能,可以直接包装真实的AppInfoHelper实例,然后Stub特定方法:

import 'package:mockito/mockito.dart';

void main() {
  late AppInfoHelper realHelper;
  late SpyAppInfoHelper spyHelper;
  late PackageInfo mockPackageInfo;

  setUp(() {
    realHelper = AppInfoHelper();
    spyHelper = spy(realHelper);
    mockPackageInfo = PackageInfo(
      appName: 'TestApp',
      version: '1.0.0',
      buildNumber: '100',
      packageName: 'com.test.app',
      buildSignature: '',
    );
    when(spyHelper.getPackageInfo()).thenAnswer((_) async => mockPackageInfo);
  });

  // 测试用例和上面一致
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 19:40:37