Flutter中Mock Dio做接口测试报Null不属于BaseOptions类型如何解决
错误原因
- 你用Mockito生成的
DioMock默认所有属性返回值都是null,当NetworkService构造函数中访问dio.options时拿到的是null,不符合BaseOptions类型要求,直接触发报错。 - 初始化顺序错误:你先实例化
NetworkService,之后才配置dio.options,但构造函数执行时就已经访问了dio.options,配置操作完全没生效。 - 后续还有请求参数匹配、返回数据结构、断言类型的错误也会导致测试不通过。
修复步骤
- 提前Stub Dio的必填属性:先创建真实的
BaseOptions和InterceptorList实例,在实例化NetworkService之前就配置Mock的返回值。 - 调整初始化顺序:先完成所有Dio的Stub配置,再初始化
NetworkService。 - 修正请求匹配规则:匹配
getRecipe方法中实际传入的请求路径。 - 修正返回数据结构和断言类型:返回符合接口结构的模拟数据,断言类型和实际返回值匹配。
修正后的测试代码
class DioMock extends Mock implements DioForNative {} main() { final dio = DioMock(); // 提前stub options属性,返回真实的BaseOptions实例 final mockOptions = BaseOptions(); when(dio.options).thenReturn(mockOptions); // stub interceptors属性,返回真实的拦截器列表实例 when(dio.interceptors).thenReturn(InterceptorList()); // 完成所有stub后再初始化NetworkService final service = NetworkService(dio); test("should return list of Recipe", () async { // 构造符合接口返回格式的模拟数据 final mockResponseData = { 'results': [ {'title': '测试菜谱', 'id': 1} ] }; final response = Response( requestOptions: RequestOptions(path: '/?page=1&query=beef'), data: mockResponseData, statusCode: 200, ); // 匹配实际调用的get方法参数 when(dio.get('/?page=1&query=beef')) .thenAnswer((_) async => response); final result = await service.getRecipe(); // 断言类型和返回值匹配,getRecipe返回的是List<Recipe> expect(result, isA<List<Recipe>>()); expect(result.length, 1); }); }
内容的提问来源于stack exchange,提问作者Henrique Tavolaro
相关产品推荐
相关产品推荐

