😽

Flutter / mockito

2022/12/09に公開

資料

開発者・コミュニティ・歴史

モチベーション

  • unit testをするためにモックが必要
  • モックを自分で実装するのは面倒なので、自動生成したい

使い方

基本

flutter pub add mockito
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';

// Annotation which generates the cat.mocks.dart library and the MockCat class.
([MockSpec<Cat>()])
import 'cat.mocks.dart';

// Real class
class Cat {
  String sound() => "Meow";
  bool eatFood(String food, {bool? hungry}) => true;
  Future<void> chew() async => print("Chewing...");
  int walk(List<String> places) => 7;
  void sleep() {}
  void hunt(String place, String prey) {}
  int lives = 9;
}

void main() {
  // Create mock object.
  var cat = MockCat();
}
flutter pub run build_runner build
# OR
dart run build_runner build

メソッドの実行確認: verify関数

// Interact with the mock object.
cat.sound();
// Verify the interaction.
verify(cat.sound());

Stubもできる

stubにしたメソッドは、stubで指定した値を何度でも返す。

// Stub a mock method before interacting.
when(cat.sound()).thenReturn("Purr");
expect(cat.sound(), "Purr");

// You can call it again.
expect(cat.sound(), "Purr");

// Let's change the stub.
when(cat.sound()).thenReturn("Meow");
expect(cat.sound(), "Meow");

// You can stub getters.
when(cat.lives).thenReturn(9);
expect(cat.lives, 9);

// You can stub a method to throw.
when(cat.lives).thenThrow(RangeError('Boo'));
expect(() => cat.lives, throwsRangeError);

// We can calculate a response at call time.
var responses = ["Purr", "Meow"];
when(cat.sound()).thenAnswer((_) => responses.removeAt(0));
expect(cat.sound(), "Purr");
expect(cat.sound(), "Meow");

stubとは

テスト対象に都合の良いデータを出力してくれる
受信メッセージのテスト

mockとは

テスト対象からの出力を受けてくれる
送信メッセージのテスト

Stubを利用するときの注意点

thenReturnでFutureやStreamを返すとArgumentErrorになる → thenAnswerを使いましょう

Discussion