mockito について
Dart と Flutter のテストで Mockito を使う開発者向けのガイドです。モック生成、スタブ設定、引数の照合、呼び出し検証を扱います。
主な機能
- 01実オブジェクト、Fake、Mockの選択
- 02アノテーションによるMock生成
- 03戻り値とエラーのスタブ設定
- 04呼び出しの検証と引数の取得
- 05Mockのリセットと呼び出し記録
活用シーン
- 01build_runnerでテスト用Mockを生成
- 02呼び出し回数と引数の確認
- 03同期・非同期の振る舞いをスタブ化
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ evanca/ flutter-ai-rules --skill mockitoインストール後、Claude Code で/mockitoを入力して読み込まれたか確認します。
詳細
Mockito スキル
このスキルでは、Dart および Flutter のテストでモックを作成するために、mockito パッケージを正しく使用する方法を説明します。
1. モックとフェイクと実オブジェクト
| 使用するもの | 使用する場面 |
|---|---|
| 実オブジェクト | 実用上可能な場合は、モックより優先します。 |
フェイク(extends Fake) | 軽量なカスタム実装です。必要なメソッドだけをオーバーライドします。相互作用の検証が不要な場合は、モックより優先します。 |
モック(extends Mock) | 相互作用(呼び出し回数、引数)を検証する必要がある場合、または動的な応答をスタブする場合にのみ使用します。 |
- スタブデータを使って構築できる場合、データモデルをモックにしてはいけません。
- テストに
verifyアサーションがある場合にのみモックを使用し、それ以外の場合は実オブジェクトまたはフェイクを優先します。
2. モックの生成
@GenerateMocks([MyClass])
// or for nice mocks (return simple legal values for missing stubs):
@GenerateNiceMocks([MockSpec<MyClass>()])
void main() { ... }
dart run build_runner build
- デフォルトでは、モック生成のアノテーションを付けるファイルは
test/以下に限定します。 test/以外にモックを生成する必要がある場合は、build.yamlを使用します。Mockを拡張するクラスに、@overrideメソッドや実装を追加してはいけません。- モックのコンストラクター内やモッククラス内で応答をスタブしてはいけません。必ずテスト内でスタブします。
3. スタブ
final mock = MockCat();
// Return a value
when(mock.sound()).thenReturn('Meow');
// Throw an error
when(mock.sound()).thenThrow(Exception('No sound'));
// Calculate response at call time
when(mock.sound()).thenAnswer((_) => computedValue);
// Return values in sequence
when(mock.sound()).thenReturnInOrder(['Meow', 'Purr']);
- 特定の戻り値が必要な場合は、メソッドやゲッターを使用する前に必ずスタブします。
- スタブされていない場合の動作:
@GenerateMocks→ 例外をスローします。@GenerateNiceMocks→ 単純な有効値を返します。 - スタブされていない呼び出しで例外をスローするには、
throwOnMissingStub(mock)を使用します。
4. 検証
verify(mock.sound()); // called at least once
verifyNever(mock.eat(any)); // never called
verify(mock.sound()).called(2); // called exactly twice
非同期:
await untilCalled(mock.sound()); // wait for the interaction
5. 引数マッチャー
// Flexible stubbing
when(mock.eat(any)).thenReturn(true);
when(mock.eat(argThat(isNotNull))).thenReturn(true);
// Named arguments
when(mock.fetch(any, headers: any)).thenReturn(response);
- 引数マッチャーに隣接する引数に
nullを使用してはいけません。 - 名前付き引数では、
anyやargThatを引数名ではなく値として使用します。
6. 引数のキャプチャ
final captured = verify(mock.eat(captureAny)).captured;
print(captured.last); // last captured argument
条件付きでキャプチャするには、captureThatを使用します。
7. モックのリセット
reset(mock); // clear all stubs AND interactions
clearInteractions(mock); // clear only recorded interactions
8. 関数型のモック
関数型(コールバックなど)をモックするには、必要なシグネチャを持つ抽象クラスを定義し、そのクラスのモックを生成します。
abstract class Callback {
void call(String value);
}
@GenerateMocks([Callback])
9. デバッグ
logInvocations([mock1, mock2]); // print all collected invocations
参考資料
コメント
Markdown 対応