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
相关产品推荐
相关产品推荐

