面试题答案
一键面试- 添加依赖:
在
pubspec.yaml
文件中添加mockito
和test
依赖:
然后运行dev_dependencies: mockito: ^5.4.2 test: ^1.22.0
flutter pub get
下载依赖。 - 生成Mock代码:
假设网络请求使用的
Dio
实例如下定义:
使用import 'package:dio/dio.dart'; class UserApi { final Dio dio; UserApi(this.dio); Future<Response> getUserInfo() async { return await dio.get('/user/info'); } }
build_runner
生成Dio
的Mock代码。首先确保build_runner
在dev_dependencies
中:
运行dev_dependencies: build_runner: ^2.3.1
flutter pub run build_runner build
,会在项目根目录下的test/mocks
目录(需自行创建)生成MockDio.dart
文件:// Mocks generated by Mockito 5.4.2 from annotations // in my_project/test/user_api_test.dart. // Do not manually edit this file. import 'package:dio/dio.dart' as _i2; import 'package:mockito/mockito.dart' as _i1; // ignore: comment_references /// A class which mocks [Dio]. // ignore: must_be_immutable class MockDio extends _i1.Mock implements _i2.Dio { }
- 定义Mock对象、设置返回值以及进行断言验证:
import 'package:flutter_test/flutter_test.dart'; import 'package:mockito/mockito.dart'; import 'package:dio/dio.dart'; import '../lib/user_api.dart'; // 引入生成的MockDio import 'mocks/MockDio.dart'; void main() { group('UserApi', () { late MockDio mockDio; late UserApi userApi; setUp(() { mockDio = MockDio(); userApi = UserApi(mockDio); }); test('getUserInfo should return a successful response', () async { // 设置MockDio的get方法返回值 when(mockDio.get('/user/info')).thenAnswer((_) async => Response( requestOptions: RequestOptions(path: '/user/info'), statusCode: 200, data: {'name': 'John Doe'}, )); // 调用被测试方法 final response = await userApi.getUserInfo(); // 断言验证 expect(response.statusCode, 200); expect(response.data, {'name': 'John Doe'}); verify(mockDio.get('/user/info')).called(1); }); }); }
上述代码中:
- 添加依赖:确保
mockito
、test
以及build_runner
依赖被正确添加并下载。 - 生成Mock代码:利用
build_runner
根据Dio
生成Mock类MockDio
。 - 测试代码:在测试用例中,定义
MockDio
对象,通过when
方法设置MockDio
的get
方法返回模拟的Response
,调用userApi.getUserInfo()
进行网络请求模拟,最后使用expect
进行返回值断言,使用verify
验证get
方法是否被调用。