如何在Dart中对抽象类的具体方法进行单元测试?
如何测试Dart抽象类中的具体方法walk()?
你的Person抽象类里的walk()方法依赖getFoot()返回的Foot实例调用move(),要测试这个方法,核心是验证调用walk()时,Foot.move()确实被执行了。当前的MockPerson返回真实的Foot实例,无法跟踪方法调用,所以需要借助Mock工具实现验证。
解决方案步骤:
- 添加依赖
在pubspec.yaml的dev_dependencies中添加测试所需的包:
dev_dependencies: test: any mockito: ^5.4.0
- 创建Foot的Mock类
用mockito生成Foot的Mock类,用来跟踪move()方法的调用:
import 'package:mockito/mockito.dart'; class MockFoot extends Mock implements Foot {}
- 调整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() {} }
- 编写单元测试
在测试流程中注入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
相关产品推荐
相关产品推荐

