はじめに
https://testing.googleblog.com/2024/02/increase-test-fidelity-by-avoiding-mocks.html?m=1
この記事はGoogle Test Blogの記事を要約したものになります!
MockとFakeの違い
Mock
- 呼び出され方を事前定義することができるオブジェクト
- メソッドの挙動を指定して、入力値と期待値を定義できる
Fake
- 実際のクラスと同じように動く
- SQLiteを使ってDBからデータ取得をする実クラスに対して、内部的にはHash等を使って同一の値を返すようなFakeクラスなど
Mockのデメリット
- Mock用のSDKの使い方を理解する必要がある
- テストクラスの内部を正確に知っていないとMockの挙動定義だらけになって可読性が落ちる
- Mock対象のクラスに変更があった時に修正する必要が出る場合がある
- 上記によりバグの見逃しが発生する可能性がある
実コード > Fake > Mock
- 実コードが最も忠実度が高いため、テストでも極力こちらをつかう
- 実コードを使うことで実行時間が遅い、安定性に欠ける、外部サーバに接続の必要があるなどがある場合はFakeを使ってアウトプットを定義する
- Fakeが使えない場合はMockを使う
Fakeを使うことの注意点
- 実際の挙動に本当に準拠しているかのテストが必要になる
- Fakeオブジェクト自体の保守・管理が必要になる
- Fakeオブジェクト分コードが多くなる