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委托
这些委托用于定义如何构建用于操作假数据的小部件。
默认使用的委托包括:
BoolMockValueDelegateStringMockValueDelegateIntMockValueDelegateDoubleMockValueDelegateDateTimeMockValueDelegate
需要添加到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
更多关于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);
});
}
解释
-
创建模拟类:
MockUserRepository继承自Mock并实现UserRepository。这样,MockUserRepository就可以模拟UserRepository的行为。 -
设置模拟行为:使用
when方法来定义模拟对象的行为。在这个例子中,当fetchUserName(1)被调用时,返回'Mocked User 1'。 -
验证结果:使用
expect来验证模拟对象的行为是否符合预期。 -
验证方法调用:使用
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);

