使用Either包写测试遇MissingDummyValueError,求provideDummy解决方案
解决Mockito中Either<Failure, Weather>的MissingDummyValueError问题
什么是provideDummy?
Mockito生成Mock对象时,会为方法返回类型自动生成一个「占位实例」(dummy值),但对于带泛型的复杂类型(比如你用的Either<Failure, Weather>),它无法自动推断出合法的实例。provideDummy就是Mockito提供的手动指定这类类型默认占位实例的函数——哪怕你已经手动Stub了所有Mock方法,Mockito内部初始化时可能还是需要这个dummy值来完成逻辑。
解决方法
只需在测试初始化阶段,给Either<Failure, Weather>类型手动提供一个合法的实例即可,步骤如下:
- 在测试文件开头导入必要的包:
import 'package:mockito/mockito.dart'; import 'package:dartz/dartz.dart'; // 导入你的Failure和Weather类 import 'package:your_project/core/errors/failure.dart'; import 'package:your_project/features/weather/domain/entities/weather.dart';
- 在创建Mock对象之前,调用
provideDummy指定占位实例:
void main() { // 先提供dummy值,再初始化Mock provideDummy<Either<Failure, Weather>>(Left(ServerFailure())); late MockWeatherRepository mockRepo; late GetCurrentWeatherUseCase useCase; setUp(() { mockRepo = MockWeatherRepository(); useCase = GetCurrentWeatherUseCase(mockRepo); }); // 你的测试用例... }
可选:用provideDummyBuilder动态生成
如果需要每次生成不同的dummy实例,可以用provideDummyBuilder:
provideDummyBuilder<Either<Failure, Weather>>(() => Left(ServerFailure()));
注意事项
- 确保提供的实例是合法的:比如用
Left(Failure子类实例)或Right(Weather实例),不能传null(除非类型允许null) - 必须在创建Mock对象前调用
provideDummy,否则Mock初始化时依然会报错 - 选择任意符合类型的实例即可,比如用你的项目中常用的Failure子类(如
ServerFailure、CacheFailure)
内容的提问来源于stack exchange,提问作者BerkayCelikdemir
相关产品推荐
相关产品推荐

