[Dart] mockitoを使ってユニットテストを実装する

flutterで開発中のアプリのユニットテストを書いていると、DBを利用しているようなクラスはモック化したくなりました。

mockitoを使うと気軽にモックを作ることができるので、使い方のメモです。

mockitoの導入

まずはpubspec.ymlに必要なライブラリを追加していきます。

モックを自動生成するにはmockitoの他にbuild_runnerも必要になるので、この2つを追加します。

下記のようにdev_dependenciesに記述します。

dev_dependencies:
  flutter_test:
    sdk: flutter
  mockito: ^5.4.5 # 追加
  build_runner: ^2.4.14 # 追加

モックを作成する

今回は、Hello!と返すだけの↓のシンプルなクラスのモックを作成してみます。

class Sample {
  String getMessage() {
    return "Hello!";
  }
}

test/sample_test.dartというテストクラスを作成して、以下のように記述します。

import 'package:flutter_sample/sample.dart';
import 'package:mockito/annotations.dart';

@GenerateNiceMocks([MockSpec<Sample>()])
void main() {
}

ポイントは@GenerateNiceMocksの行で、これを書くことでSampleクラスのモックを自動生成できるようになります。

次に、下記のコマンドを実行します。

$ dart run build_runner build

するとtest/sample_test.mocks.dartというファイルが生成されます。これがSampleクラスのモッククラスです。

これでモッククラスを自動生成することができました。

モックを利用したユニットテストを作成する

モッククラスの生成ができたので、モックを使ったユニットテストを作成します。

先ほど作成したtest/sample_test.dartにテストを書いていきます。

import 'package:flutter_sample/sample.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';

import 'sample_test.mocks.dart';

@GenerateNiceMocks([MockSpec<Sample>()])
void main() {
  test('test', () {
    Sample sample = MockSample(); // モックを作成
    when(sample.getMessage()).thenReturn('Hi!'); // getMessage()を呼ぶと"Hi!"と返ってくるように設定

    expect(sample.getMessage(), 'Hi!');
  });
}

本来、SampleクラスのgetMessage()を呼ぶと”Hello!”という文字列が返ってきますが、上記テストではモックを利用して”Hi!”という文字列が返るようにしています。

このようにメソッドの返り値をモック化することで、DBやAPIなど利用しているメソッドの振る舞いを固定することができ、外部環境に依存しないユニットテストを作成することができます。

参考:

mockito | Dart package
A mock framework inspired by Mockito with APIs for Fakes, Mocks, behavior verification, and stubbing.
Mockito not generating mocks
I had some existing mocks with mockito. I changed the names of some classes that had been mocked and now mockito doesn't...

コメント