⚙️
【Flutter】Dart3.0のsealedをMockitoで使うときの対処法
概要
Flutterのテストコードにおいて、Mockitoを使ってモックを返す時、Result
などのsealed
クラスを返すメソッドのテストを実行すると、ダミー値を生成するところでエラーが発生してしまう問題があります。
エラーで検索したら英語文献しかなかったので、対処法を書いてみました。
Resultについて
テストについて
今回は、RepositoryがAPIから値を取得した際に、Result
型でSuccess
orFailure
を返してくるので、その結果によって、StateNotifier
の値が正しく更新されることをテストしたい状況です。
エラーが発生するテストコード
sample_test.dart
void main() {
test('fetchSampleItems', () async {
final stubItemList = [MockSampleItem()];
final mockRepository = MockSampleRepository();
when(mockRepository.fetchItemResultFor('')).thenAnswer((_) => Success(stubItemList).toFuture());
final notifier = SampleItemNotifier(repository: mockRepository);
const arg1 = 'arg1';
await notifier.fetchSampleItems(arg1: arg1);
expect(notifier.state, SampleItemState(sampleItemList: stubItemList));
});
}
エラーの内容
MissingDummyValueError: Result<List<SampleItem>, Exception>
This means Mockito was not smart enough to generate a dummy value of type
'Result<List<SampleItem>, Exception>'. Please consider using either 'provideDummy' or 'provideDummyBuilder'
functions to give Mockito a proper dummy value.
対処法
エラーメッセージにも書いてある通り、provideDummy
を使用する。
具体的には、when
でStubの値を返す前に、Result<List<SampleItem>, Exception>
のprovideDummy
を実行し、ダミー値を生成する必要がある
provideDummy<Result<List<SampleItem>, Exception>>(Success(stubItemList));
エラーが出ないコード(解決後のコード)
sample_test.dart
void main() {
test('fetchSampleItems', () async {
final stubItemList = [MockSampleItem()];
final mockRepository = MockSampleRepository();
// ここにprovideDummyを追加!
provideDummy<Result<List<SampleItem>, Exception>>(Success(stubItemList));
when(mockRepository.fetchItemResultFor('')).thenAnswer((_) => Success(stubItemList).toFuture());
final notifier = SampleItemNotifier(repository: mockRepository);
const arg1 = 'arg1';
await notifier.fetchSampleItems(arg1: arg1);
expect(notifier.state, SampleItemState(sampleItemList: stubItemList));
});
}
参考リンク
Discussion