Open1

テストのために全部を仮想関数にするのは誤り?

堀江誠一堀江誠一

Google Mock ドキュメント日本語訳 - 具象クラスのモック化に対する代替案には以下のように書いてある。

非仮想関数を仮想関数に変更するのは重大な決断です.これによって,派生クラスがあなたのクラスの挙動を変更できてしまう拡張ポイントが作成されます.クラスを不変な状態に保つのが難しくなるので,そのクラスに対するあなたの支配力が弱まります.派生クラスがそれをオーバーライドする正当な理由がある場合のみ,仮想関数に変更するべきでしょう.

うーん。そうか?そうなのか?外部から呼ばれる関数は全部仮想関数にしている。そうしないとモック化して呼び出し側の試験をすることができないから。

モックをはじめとするテスト・ダブルの話を読んでいると、真っ二つに意見が割れている。ある種の人はモックやダブルはあまり役に立たないという。

多分「レイヤーとして働くコードのテスト」を主として書いている人か「関数として働くコードのテスト」を主として書いている人かで意見が変わるのだろう。仮想関数に関してもそのような立場のバイアスがあるのだろうか。