【Flutter】ユニットテストでの Mock の使い方 | ヒヨコ プログラミング(ヒヨプロ)

【Flutter】ユニットテストでの Mock の使い方

Dart

本記事では、Flutter のユニットテストにおいて、Mock を使う方法について紹介します。

基本的なユニットテスト方法については、以下の記事をご参照ください。

Mock とは?

Mock とは、特定のクラスやコンポーネントの擬似オブジェクトで、テストの際にそのクラスやコンポーネントの振る舞いをシミュレートします。実際のデータや実環境を使わずに、特定の状況や振る舞いを作り出すことができます。
例えば、APIを呼び出してデータを取得する部分をテストする場合、実際に外部APIにアクセスすると遅延やエラーのリスクが伴います。これを避けるために、APIをモックし、固定のデータを返すようにすることで、APIに依存しないテストが可能になります。

Mock の使用方法

パッケージのインストール

まずは、mockito と build_runner のパッケージをインストールしましょう。
mockito は、Mock オブジェクトを生成するためのパッケージです。
build_runner は、Mockito のコード生成を自動化するためのパッケージです。

Mock 対象クラスの作成

次に、Mock 対象となるクラスを用意しましょう。
今回は、以下のような外部 API を使用してデータを取得する ApiClient というクラスを用意しました。

class ApiClient {
  Future<String> fetchData() async {
    // 外部APIにリクエストを送る処理
    return 'Real Data';
  }
}

Mock クラスの生成

Mock 対象のクラスを用意できたら、Mock クラスを生成します。
テストファイルとして api_client_test.dart を作成し、コードを以下のように記述します。
@GenerateMocks アノテーションを使用することで、ApiClient の Mock クラスである MockApiClient クラスを生成できます。

import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'api_client.dart'; // Mock対象のクラスをインポート

// Mockクラスを生成するためのアノテーション
@GenerateMocks([ApiClient])
void main() {
  // テストケースは後で記述します
}

上記のようにテストファイルを作成できたら、以下のコマンドを実行して Mock クラスを生成します。

flutter pub run build_runner build

このコマンドの実行結果として、api_client_test.mocks.dart が自動生成されて、そこに MockApiClient というクラスが作成されます。

テストコードの作成

Mock クラスを生成できたら、テストコードを作成します。
今回は、以下のようなテストを書いてみました。

import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'package:sample/api_client.dart';  // Mock対象のクラスをインポート
import 'api_client_test.mocks.dart'; // 自動生成されたMockクラス

// Mockクラスを生成するためのアノテーション
@GenerateMocks([ApiClient])
void main() {
  late MockApiClient mockApiClient;

  setUp(() {
    mockApiClient = MockApiClient(); // Mockのインスタンスを作成
  });

  test('fetchData returns mock data', () async {
    // MockされたfetchDataメソッドの動作を定義
    when(mockApiClient.fetchData()).thenAnswer((_) async => 'Mock Data');

    // fetchDataメソッドを実行し、Mockの結果を確認
    expect(await mockApiClient.fetchData(), 'Mock Data');
  
    // 呼び出されたかを検証
    verify(mockApiClient.fetchData()).called(1);
  });
}

上記のテストコード例では、when で Mock メソッドの fetchData() が呼ばれた時に返す値を設定しています。
また、verify で fetchData() の呼び出し回数が正しいかどうかも検証しています。

まとめ

今回は、Flutter で Mock を使ったユニットテストの方法について紹介しました!

  • Flutter で Mock を使用するには、mockito パッケージと build_runner パッケージをインストールする
  • @GenerateMocks アノテーションとコマンド実行で Mock クラスを作成する
  • when で Mock メソッドが呼ばれた時の動作を設定する

以上で、【Flutter】ユニットテストでの Mock の使い方 は終わりです。

参考

おすすめ書籍

コメント

タイトルとURLをコピーしました