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

如何在Dart中对抽象类的具体方法进行单元测试?

如何测试Dart抽象类中的具体方法walk()?

你的Person抽象类里的walk()方法依赖getFoot()返回的Foot实例调用move(),要测试这个方法,核心是验证调用walk()时,Foot.move()确实被执行了。当前的MockPerson返回真实的Foot实例,无法跟踪方法调用,所以需要借助Mock工具实现验证。

解决方案步骤:

  1. 添加依赖
    在pubspec.yaml的dev_dependencies中添加测试所需的包:
dev_dependencies:
  test: any
  mockito: ^5.4.0
  1. 创建Foot的Mock类
    用mockito生成Foot的Mock类,用来跟踪move()方法的调用:
import 'package:mockito/mockito.dart';

class MockFoot extends Mock implements Foot {}
  1. 调整MockPerson支持注入MockFoot
    修改MockPerson,让它可以接收自定义的Foot实例,方便测试时传入Mock对象:
class MockPerson extends Person {
  Foot? _foot;

  void setFoot(Foot foot) {
    _foot = foot;
  }

  @override
  Foot getFoot() {
    return _foot ?? Foot();
  }

  @override
  void speak() {}
}
  1. 编写单元测试
    在测试流程中注入MockFoot,调用walk()后验证move()方法的调用情况:
import 'package:test/test.dart';
import 'package:mockito/mockito.dart';

void main() {
  late MockPerson sut;
  late MockFoot mockFoot;

  setUp(() {
    mockFoot = MockFoot();
    sut = MockPerson();
    sut.setFoot(mockFoot);
  });

  test('调用walk()会触发Foot.move()', () {
    // 执行测试方法
    sut.walk();

    // 验证MockFoot的move方法被调用一次
    verify(mockFoot.move()).called(1);
  });
}

说明:

  • 通过MockFoot可以精准跟踪move()方法的调用次数、参数等,确保walk()的逻辑符合预期——即调用getFoot()获取实例后执行move()。
  • 若使用mockito 5.x及以上版本,可能需要配合mockito_codegen生成Mock类,但核心思路始终是用Mock替代真实依赖,验证交互逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 18:45:38