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...
コメント