Flutter模拟数据插件mockitory的使用

Flutter模拟数据插件mockitory的使用

该插件的目的在于帮助测试Flutter应用时使用假数据,而无需修改代码。

通过使用Mockitory,你可以通过添加flutter_mockitory小部件来模拟数据层。

如何使用?

添加依赖

pubspec.yaml文件中添加依赖:

dependencies:
  flutter_mockitory: 

如果你想要使用纯Dart的Mockitory(例如用于服务器端的应用),可以使用mockitory代替flutter_mockitory依赖。

使用Mockitory混入

首先导入Mockitory库:

import 'package:mockitory/mockitory.dart';

然后创建一个类并使用Mockitory混入:

enum Gender { male, female }

class ExampleMockitory with Mockitory {
  // 提供初始的模拟值
  [@override](/user/override)
  Map<String, MockValue> get initialMockValues => {
        'boolValue': MockValue<bool>(true),
        'intValue': MockValue<int>(1),
        'doubleValue': MockValue<double>(4.5),
        'gender': MockValue<Gender>(Gender.male),
        'listOfInts': MockValue<List<int>>([0, 1]),
        'dateValue': MockValue<DateTime>(DateTime(2020, 5, 5)),
      };

  // 观察性别变化
  Stream<Gender> observeGender() => observeMockValueUpdates<Gender>('gender')
      .map((mockValue) => mockValue.value);

  // 获取日期值
  DateTime getDateValue() => getValue<DateTime>('dateValue');
}

注意: 记住要使用类型化的MockValue对象。例如:MockValue<bool>(true)

使用MockitoryPage小部件

MockitoryPage小部件用于自动生成用于更新/显示假数据的小部件列表。

final mockitory = ExampleMockitory();

// 使用MockitoryPage
MockitoryPage(
  mockitory: mockitory,
  customDelegates: [
    CustomBoolMockValueDelegate(), // 自定义布尔值委托
    ChoicesMockValueDelegate<Gender>([Gender.male, Gender.female]), // 性别选择器
    IterableMockValueDelegate<int>([0, 1], [1, 4, 5]), // 整数列表选择器
  ],
)

内置的MockValue委托

这些委托用于定义如何构建用于操作假数据的小部件。

默认使用的委托包括:

  • BoolMockValueDelegate
  • StringMockValueDelegate
  • IntMockValueDelegate
  • DoubleMockValueDelegate
  • DateTimeMockValueDelegate

需要添加到MockitoryPage小部件的customDelegates属性中的委托包括:

  • ChoicesMockValueDelegate<T> - 例如:ChoicesMockValueDelegate<Gender>([Gender.male, Gender.female])
  • IterableMockValueDelegate<T> - 例如:IterableMockValueDelegate<int>([0, 1], [1, 4, 5])

自定义委托

你也可以提供自己的自定义委托:

class CustomBoolMockValueDelegate extends MockValueDelegate<bool> {
  [@override](/user/override)
  Widget buildMockValueWidget(BuildContext context, bool value, onChanged) {
    return Checkbox(
      activeColor: Colors.red,
      value: value,
      onChanged: (value) => onChanged(MockValue(value)),
    );
  }
}

示例代码

以下是完整的示例代码:

import 'package:mockitory/mockitory.dart';

enum Gender { male, female }

class ExampleMockitory with Mockitory {
  [@override](/user/override)
  Map<String, MockValue> get initialMockValues => {
        'boolValue': MockValue<bool>(true),
        'intValue': MockValue<int>(1),
        'doubleValue': MockValue<double>(4.5),
        'gender': MockValue<Gender>(Gender.male),
        'listOfInts': MockValue<List<int>>([0, 1]),
        'dateValue': MockValue<DateTime>(DateTime(2020, 5, 5)),
      };

  Stream<Gender> observeGender() => observeMockValueUpdates<Gender>('gender')
      .map((mockValue) => mockValue.value);
}

更多关于Flutter模拟数据插件mockitory的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter模拟数据插件mockitory的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


mockito 是一个用于 Dart 和 Flutter 的模拟库,它允许你在测试中创建模拟对象。这对于单元测试和集成测试非常有用,因为它可以让你模拟依赖项的行为,从而隔离和测试特定的代码逻辑。

安装 mockito

首先,你需要在 pubspec.yaml 文件中添加 mockito 作为开发依赖项:

dev_dependencies:
  mockito: ^5.0.0

然后运行 flutter pub get 来安装依赖。

使用 mockito 创建模拟对象

假设你有一个简单的 UserRepository 类,它从远程服务获取用户数据:

class UserRepository {
  Future<String> fetchUserName(int userId) async {
    // 模拟网络请求
    await Future.delayed(Duration(seconds: 1));
    return 'User $userId';
  }
}

在测试中,你可能不想真正发起网络请求,而是模拟 UserRepository 的行为。你可以使用 mockito 来创建一个模拟对象:

import 'package:mockito/mockito.dart';
import 'package:test/test.dart';

// 创建模拟类
class MockUserRepository extends Mock implements UserRepository {}

void main() {
  test('fetchUserName returns the correct user name', () async {
    // 创建模拟对象
    final mockUserRepository = MockUserRepository();

    // 设置模拟行为
    when(mockUserRepository.fetchUserName(1)).thenAnswer((_) async => 'Mocked User 1');

    // 调用方法并验证结果
    expect(await mockUserRepository.fetchUserName(1), 'Mocked User 1');

    // 验证方法是否被调用
    verify(mockUserRepository.fetchUserName(1)).called(1);
  });
}

解释

  1. 创建模拟类MockUserRepository 继承自 Mock 并实现 UserRepository。这样,MockUserRepository 就可以模拟 UserRepository 的行为。

  2. 设置模拟行为:使用 when 方法来定义模拟对象的行为。在这个例子中,当 fetchUserName(1) 被调用时,返回 'Mocked User 1'

  3. 验证结果:使用 expect 来验证模拟对象的行为是否符合预期。

  4. 验证方法调用:使用 verify 来验证某个方法是否被调用,以及被调用的次数。

其他常用功能

  • 模拟异常:你可以使用 thenThrow 来模拟抛出异常。

    when(mockUserRepository.fetchUserName(1)).thenThrow(Exception('Network error'));
    
  • 模拟异步操作:使用 thenAnswer 来模拟异步操作。

    when(mockUserRepository.fetchUserName(1)).thenAnswer((_) async => 'Mocked User 1');
    
  • 验证方法调用次数:你可以使用 called 来验证方法被调用的次数。

    verify(mockUserRepository.fetchUserName(1)).called(1);
回到顶部