运行Flutter测试时遇到Null类型不匹配错误求助
针对你遇到的type 'Null' is not a subtype of type 'Future<Either<Failure, NumberTrivia>>'错误,从以下几个方向逐一排查:
1. 检查Repository方法的返回类型定义
确认NumberTriviaRepository中的getConcreteNumberTrivia方法签名是否明确为非空的Future<Either<Failure, NumberTrivia>>,而非可空的Future<Either<Failure, NumberTrivia>>?。空安全启用后,若方法返回值声明与实际mock返回的类型不匹配(比如声明可空但返回非空值,反之亦然),会触发该类型错误。
2. 验证Mock方法的参数匹配逻辑
当前测试中你用固定值1设定mock行为,但调用用例时传入的是const tNumber = 1。虽然值相同,但Mockito的参数匹配器在部分版本下可能存在严格性问题,尝试改用参数匹配器确保匹配准确:
// 替换固定参数为any匹配器 when(mockNumberTriviaRepository.getConcreteNumberTrivia(any)) .thenAnswer((_) async => const Right(tNumberTrivia));
同时确认getConcreteNumberTrivia的参数类型与tNumber完全一致(比如均为int,无隐式类型转换)。
3. 检查Usecase的execute方法实现
查看GetConcreteNumberTrivia类的execute方法,确保它正确调用repository方法并直接返回结果,没有额外空值处理导致返回null。正确的实现示例如下:
class GetConcreteNumberTrivia { final NumberTriviaRepository repository; GetConcreteNumberTrivia(this.repository); Future<Either<Failure, NumberTrivia>> execute({required int number}) async { return repository.getConcreteNumberTrivia(number); } }
若execute方法存在条件分支,需确保所有分支都返回Either类型,而非null。
4. 适配Mockito版本与空安全
如果使用的是Mockito 5.x+版本,确认mock类的生成符合空安全要求:
- 确保
mockito和build_runner依赖为最新稳定版 - 若使用
@GenerateMocks注解,重新运行flutter pub run build_runner build生成mock类,避免旧版本mock类无法处理非空返回类型导致默认返回null。
5. 确认Either与Failure的类型正确性
检查Failure类的定义是否正确,且Either<Failure, NumberTrivia>的泛型参数无拼写错误。若Failure存在子类或类型别名,需确保mock返回的Right/Left类型与repository方法声明的完全一致。
内容的提问来源于stack exchange,提问作者MitchW

