mcpField
M
mockito

mockito

github.com/evancaテスト・品質663194 回インストール3 週間前に更新
リポジトリ

mockito について

Dart と Flutter のテストで Mockito を使う開発者向けのガイドです。モック生成、スタブ設定、引数の照合、呼び出し検証を扱います。

主な機能

  1. 01実オブジェクト、Fake、Mockの選択
  2. 02アノテーションによるMock生成
  3. 03戻り値とエラーのスタブ設定
  4. 04呼び出しの検証と引数の取得
  5. 05Mockのリセットと呼び出し記録

活用シーン

  1. 01build_runnerでテスト用Mockを生成
  2. 02呼び出し回数と引数の確認
  3. 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

参考資料

コメント