使用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
相关产品推荐
相关产品推荐

