テストダブル
事前に押さえておくべき用語:間接入力と間接出力
「テストコード」から見えない「テスト対象」への入力
外部メソッドからの戻り値を指す
その戻り値によってテスト対象の振る舞いが変わる
外部メソッドがDBからデータを取得する処理だと考えるとわかりやすい
「テストコード」から見えない「テスト対象」の出力
外部メソッドに引数を与えることを指す
「テストコード」は「テスト対象」をテストする
「テスト対象」に含まれる「外部メソッド」がテストダブルになりうる
なぜ「外部メソッド」をテストダブルに置き換えるのか
実行上の制約をもつから
DBの書き換えやスクレイピングする処理のような副作用がある処理は本番までしたくない
外部メソッドの処理結果を操作したいから
処理結果に応じて「テスト対象」の処理内容が変化するとき、その内容をテストする
分類として5つくらいある
テスト対象への間接入力を操作する
例:Serviceクラスでのテスト。HTTPクライアントやRepositoryが返す値を制御
間接出力が正しいか検証する。テストコードで間接出力を参照可能しテストする
差し込んだオブジェクトは本物のふるまいをする
間接出力が正しいか検証する。
差し込んだオブジェクトは何もしない。スタブっぽい振る舞い
例:Mockitoのverify
テストの範囲内で本物と同じように動作する
例:インメモリデータベースでのテスト
スタブ:値を返すことでテストの条件を整える
モック:呼び出しがあったことを検証する
※多くのテストライブラリではモックにスタブ機能も含まれるためややこしい
参考・引用文献
public.icon