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

使用blocTest测试fpdart的Either类型遇Mockito报错的解决问询

解决Mockito无法生成fpdart Either类型Dummy值的问题

问题原因

Mockito无法自动生成Either<Failure, List<Anime>>这类自定义泛型类型的默认dummy实例,因此在初始化Mock对象时抛出MissingDummyValueError。

解决方案

有两种常用方式可以解决这个问题:

1. 全局提供Either类型的Dummy值

在测试文件的main函数中,通过setUpAll注册该Either类型的默认dummy值,供Mockito使用:

void main() {
  setUpAll(() {
    // 提供一个合法的Either实例作为dummy值,这里用Right空列表示例
    provideDummy<Either<Failure, List<Anime>>>(const Right([]));
  });

  group('⭐️ When [Started] is added.  ', () {
    Failure failure = Failure.badRequest();
    final failureEither = Either<Failure, List<Anime>>.left(failure);

    blocTest('emits [Loading,Error]',
        build: () => landingBloc,
        setUp: () {
          when(animeRepository.getPopularAnime())
              .thenAnswer((_) async => failureEither);
        },
        act: (bloc) => bloc.add(const LandingEvent.started()),
        expect: () => [
              const LandingState.loading(),
              LandingState.error(failure),
            ]);
  });
}

2. 生成Mock时指定默认返回值

在@GenerateNiceMocks的MockSpec中,直接给AnimeRepository的所有未存根方法指定默认返回值:

@GenerateNiceMocks([
  MockSpec<AnimeRepository>(
    // 给所有未手动存根的方法提供默认返回值
    returnValueForMissingStub: Future.value(const Right([])),
  ),
])

这种方式适合需要给Mock仓库的所有方法统一设置默认返回的场景。

说明

两种方式本质都是给Mockito提供一个合法的Either<Failure, List<Anime>>实例,让它能完成Mock对象的初始化。你可以根据测试需求选择更合适的方式——如果仅需针对单个类型解决问题,第一种方式更灵活;如果需要统一Mock仓库的默认行为,第二种方式更高效。

内容的提问来源于stack exchange,提问作者Anthony Rodriguez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 13:55:17