⚙️

【Flutter】Dart3.0のsealedをMockitoで使うときの対処法

2024/01/02に公開

概要

Flutterのテストコードにおいて、Mockitoを使ってモックを返す時、Resultなどのsealedクラスを返すメソッドのテストを実行すると、ダミー値を生成するところでエラーが発生してしまう問題があります。

エラーで検索したら英語文献しかなかったので、対処法を書いてみました。

Resultについて

https://zenn.dev/masakunn/articles/e9244ba264578e

テストについて

今回は、RepositoryがAPIから値を取得した際に、Result型でSuccessorFailureを返してくるので、その結果によって、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));
  });
}

参考リンク

https://github.com/dart-lang/mockito/issues/675

Discussion