You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Either包写测试遇MissingDummyValueError,求provideDummy解决方案

解决Mockito中Either<Failure, Weather>的MissingDummyValueError问题

什么是provideDummy?

Mockito生成Mock对象时,会为方法返回类型自动生成一个「占位实例」(dummy值),但对于带泛型的复杂类型(比如你用的Either<Failure, Weather>),它无法自动推断出合法的实例。provideDummy就是Mockito提供的手动指定这类类型默认占位实例的函数——哪怕你已经手动Stub了所有Mock方法,Mockito内部初始化时可能还是需要这个dummy值来完成逻辑。

解决方法

只需在测试初始化阶段,给Either<Failure, Weather>类型手动提供一个合法的实例即可,步骤如下:

  1. 在测试文件开头导入必要的包:
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';
  1. 在创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 04:52:44