Flutter中如何用Mockito覆盖未覆盖的特定条件代码行?
Flutter Mockito测试补充:覆盖
caregiverStatus != null && caregiverStatus!.contains('Pending')分支 问题背景
当前业务代码中,manageCaregiverLabel的逻辑分支caregiverStatus != null && caregiverStatus!.contains('Pending')未被现有测试覆盖,需要补充Mockito测试用例。
业务代码
String get manageCaregiverLabel => isCaregiverAssignedToPatient || caregiverStatus != null && caregiverStatus!.contains('Pending') ? 'Caregiver: ${_nameShortenerService.abbreviateLastName( _caregiverService.caregiverInvitation?.name ?? '', )}' : _localizer.myAccountLandingScreen_inviteCaregiver;
现有测试代码
test( 'manageCaregiverLabel returns correct value when caregiver is assigned', () { when( mockUserService.relatedUserSummary, ).thenReturn(caregiverMockSummary); when(mockCaregiverService.caregiverInvitation?.name).thenReturn(null); when(mockNameShortenerService.abbreviateLastName(any)) .thenReturn('John D.'); when( mockCaregiverService.getCaregiverStatus( testLocal, ), ).thenReturn('Pending'); final result = viewModel.isCaregiverAssignedToPatient || viewModel.caregiverStatus != null && viewModel.caregiverStatus!.contains('Pending') ? 'Caregiver: ${mockNameShortenerService.abbreviateLastName( mockCaregiverService.caregiverInvitation?.name ?? '', )}' : localizer.myAccountLandingScreen_inviteCaregiver; expect(viewModel.caregiverStatus, isNotNull); expect(viewModel.caregiverStatus, 'Pending'); expect(result, viewModel.manageCaregiverLabel); }); });
解决方案
要覆盖目标分支,需利用逻辑运算符||的短路特性:让第一个条件isCaregiverAssignedToPatient为false,同时确保caregiverStatus是非空且包含'Pending'的字符串,这样代码才会进入目标分支的判断。
补充测试用例代码
test( 'manageCaregiverLabel returns caregiver label when status is Pending and no assigned caregiver', () { // 1. 控制isCaregiverAssignedToPatient为false // 若该属性依赖mock服务,比如通过relatedUserSummary判断,就返回null或非caregiver类型的摘要 when(mockUserService.relatedUserSummary).thenReturn(null); // 若属性可直接设置,直接赋值即可:viewModel.isCaregiverAssignedToPatient = false; // 2. 设置caregiverStatus为非空的'Pending'值 when(mockCaregiverService.getCaregiverStatus(testLocal)).thenReturn('Pending'); // 3. 配置其他依赖的返回值 when(mockCaregiverService.caregiverInvitation?.name).thenReturn('Jane Smith'); when(mockNameShortenerService.abbreviateLastName('Jane Smith')).thenReturn('Jane S.'); // 4. 验证结果符合预期 expect(viewModel.manageCaregiverLabel, 'Caregiver: Jane S.'); }, );
关键说明
- 逻辑优先级:
&&比||优先级高,原代码逻辑等价于isCaregiverAssignedToPatient || (caregiverStatus != null && caregiverStatus!.contains('Pending')),必须让第一个条件不成立,才会触发第二个条件的判断。 - 若
isCaregiverAssignedToPatient是私有属性,需通过mock其依赖的服务间接控制取值,比如让mockUserService.relatedUserSummary返回非caregiver类型的数据。
内容的提问来源于stack exchange,提问作者Nithyashree B L
相关产品推荐
相关产品推荐

