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

Flutter TDD项目测试报Bad state错误,求正确运行测试方案

解决Flutter TDD测试中的Bad state: No method stub was called from within when()错误

错误信息

Bad state: No method stub was called from within when(). Was a real method called, or perhaps an extension method?

问题代码

Repository代码

abstract class HomeRepository {
    Future<Either<Failure,BaseModel>> testCase({required ApiRequest apiRequest});
}

UseCase代码

class TestCase {
  HomeRepository homeRepository;
  TestCase({required this.homeRepository});
  Future<Either<Failure,BaseModel>>call({required ApiRequest apiRequest})async{
    return await homeRepository.testCase(apiRequest: apiRequest);
  }
}

测试代码(原错误版本)

class HomeTest extends Mock implements HomeRepository{
  @override
  Future<Either<Failure,BaseModel>> testCase({required ApiRequest apiRequest})async{
     return await Right(AppModel.otpVerify);
  }
}

void main(){
  ApiRequest apiRequest = ApiRequest(method: ApiMethod.post, endPoint: '/');
  late HomeTest homeTest;
  late TestCase testCase;
    setUp(() {
      homeTest = HomeTest();
      testCase = TestCase(homeRepository: homeTest);
    });

  test('testcase', () async {
    // Setup
    when(homeTest.testCase(apiRequest: apiRequest)).thenAnswer((_) async => right(AppModel.otpVerify));
    // Action
    final result = await testCase(apiRequest: apiRequest);
    // Verification
    expect(result, right(AppModel.otpVerify));
  });
}

错误原因

你在自定义的HomeTest Mock类中手动重写了testCase方法,导致调用when(homeTest.testCase(...))时,实际执行的是你重写的真实方法,而非Mock库提供的用于生成stub的代理方法。Mock库需要接管方法调用逻辑才能记录stub,手动重写会破坏这一机制。

解决方案

去掉HomeTest类中对testCase方法的重写,让Mock类自动处理方法的stub逻辑:

// 仅保留Mock继承和接口实现,移除手动重写的方法
class HomeTest extends Mock implements HomeRepository{}

void main(){
  ApiRequest apiRequest = ApiRequest(method: ApiMethod.post, endPoint: '/');
  late HomeTest homeTest;
  late TestCase testCase;
    setUp(() {
      homeTest = HomeTest();
      testCase = TestCase(homeRepository: homeTest);
    });

  test('testcase', () async {
    // Setup
    when(homeTest.testCase(apiRequest: apiRequest)).thenAnswer((_) async => right(AppModel.otpVerify));
    // Action
    final result = await testCase(apiRequest: apiRequest);
    // Verification
    expect(result, right(AppModel.otpVerify));
  });
}

补充说明

如果ApiRequest未正确实现==和hashCode方法,可能会导致stub匹配失败。可以通过两种方式解决:

  1. 为ApiRequest类重写==和hashCode方法
  2. 在when中使用匹配器替代具体实例:
    when(homeTest.testCase(apiRequest: any(named: 'apiRequest')))
        .thenAnswer((_) async => right(AppModel.otpVerify));
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 04:23:25