MST
星途 面试题库

面试题:Flutter中如何使用Mockito进行网络请求的Mock测试

在Flutter开发中,假设你使用Dio进行网络请求,现在需要对一个获取用户信息的网络请求进行Mock测试。请描述使用Mockito库进行Mock测试的步骤,并给出关键代码示例,包括如何定义Mock对象、设置返回值以及进行断言验证。
32.8万 热度难度
前端开发Flutter

知识考点

AI 面试

面试题答案

一键面试
  1. 添加依赖: 在pubspec.yaml文件中添加mockitotest依赖:
    dev_dependencies:
      mockito: ^5.4.2
      test: ^1.22.0
    
    然后运行flutter pub get下载依赖。
  2. 生成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_runnerdev_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 {
    }
    
  3. 定义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);
        });
      });
    }
    

上述代码中:

  • 添加依赖:确保mockitotest以及build_runner依赖被正确添加并下载。
  • 生成Mock代码:利用build_runner根据Dio生成Mock类MockDio
  • 测试代码:在测试用例中,定义MockDio对象,通过when方法设置MockDioget方法返回模拟的Response,调用userApi.getUserInfo()进行网络请求模拟,最后使用expect进行返回值断言,使用verify验证get方法是否被调用。