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

Mockito无法正确Mock GetxController生命周期方法(Flutter)

Flutter Mockito Mock GetxController 生命周期方法 MissingStubError 解决方法

在使用Mockito Mock GetxController时,调用Get.put()会触发控制器的onStart、onInit等生命周期方法,而Mockito生成的Mock类默认未Stub这些方法,导致抛出MissingStubError。以下是几种可行的解决方式:

方法一:手动Stub生命周期方法

针对需要触发的生命周期方法,提前用Mockito进行Stub,void类型方法可以用doNothing()或thenReturn(null)处理:

class CounterController extends GetxController {
  RxInt counter = 0.obs;
}

@GenerateMocks([CounterController])
void main() {
  final MockCounterController mockCounterController = MockCounterController();

  test('Mockito mocking GetxController fix', () {
    // Stub 所需的生命周期方法
    doNothing().when(mockCounterController).onStart();
    doNothing().when(mockCounterController).onInit();
    doNothing().when(mockCounterController).onClose();
    
    Get.put(mockCounterController); // 不再抛出MissingStubError
  });
}

这种方式适合需要验证生命周期方法调用情况的场景,后续可以用verify(mockCounterController.onStart()).called(1)来验证调用次数。

方法二:自定义Mock生成配置

通过@GenerateMocks的customMocks参数,配置Mock类对未Stub的方法返回默认值,避免报错:

class CounterController extends GetxController {
  RxInt counter = 0.obs;
}

@GenerateMocks([CounterController], customMocks: [
  MockSpec<CounterController>(
    onMissingStub: OnMissingStub.returnDefault,
  )
])
void main() {
  final MockCounterController mockCounterController = MockCounterController();

  test('Mockito mocking GetxController with custom mock', () {
    Get.put(mockCounterController); // 正常执行
  });
}

OnMissingStub.returnDefault会让Mockito自动为所有未手动Stub的方法提供默认实现(void方法执行空操作),无需逐个Stub生命周期方法。

方法三:使用Fake类替代Mock

如果不需要Mockito的验证功能,仅需要一个能通过Get.put()的控制器实例,可以创建Fake类继承GetxController,自带生命周期方法的空实现:

class CounterController extends GetxController {
  RxInt counter = 0.obs;
}

class FakeCounterController extends Fake implements CounterController {
  @override
  RxInt counter = 0.obs;
}

void main() {
  final FakeCounterController fakeCounterController = FakeCounterController();

  test('Using Fake instead of Mock', () {
    Get.put(fakeCounterController); // 正常执行
  });
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 11:12:12