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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 01:53:13