privateメソッドのテストどうするか議論ってテスト書いてる人なら必ずしたことありますよね?
私は、privateメソッドは、実装が隠されているのでprivateメソッドを呼び出しているpublicなメソッドさえテストすればいいと思っています。
privateメソッドの振る舞いをテストしたくなったら別のクラスに分けるべきではないかなと思います。
そんな、理論を持っている私ですが、あえてprivateメソッドのテストをします。
例えば、ビジネス的な制約で1週間後にprivateメソッド(手続き)のセマンティクスが変わるとかきっちり整理しにくい時もあると思います。
後々の拡張性と保守性が担保されていればいいと思うので、そういう時はprivateメソッドのテストを書いたりします。
環境構成
- PHP 5.6
テストを書いてみる
実装コード オラオラ言うだけのメソッドを持つクラス。
<?php class Hoge { protected function oraOra() { echo 'オラオラオラオラ!'; } }
privateメソッド
と言いましたが protectedメソッド
にします。
protectedメソッドでもカプセル化されるので良いと思います。
継承して使われたくないメソッドは、 privateメソッド
にしますが、そんなことは滅多にない。
テストコード
テストコードの中に、先ほどの Hoge
クラスを継承させた ExtHoge
クラスを用意します。
ExtHogeクラスで、protectedメソッドをラップしたメソッドを用意してあげると HogeTest
クラスで呼び出すことが可能です。
- HogeTest.php
<?php require_once 'Hoge.php'; class HogeTest extends PHPUnit_Framework_TestCase { /** * @test */ public function テスト() { $extHoge = new ExtHoge(); $extHoge->publicOraOra(); } } class ExtHoge extends Hoge { public function publicOraOra() { $this->oraOra(); } }
まとめ
継承をすることでカプセル化されたメソッドをテストすることが出来る。
privateメソッドとかカプセル化されたメソッドをテストしたいときは、引っ掛かりがあるのでクラス設計を考えなおすとかも選択肢に入れるのが良いかと思います。
最近読んだ本

- 作者: 小川雄大,柄沢聡太郎,橋口誠
- 出版社/メーカー: 技術評論社
- 発売日: 2014/10/31
- メディア: Kindle版
- この商品を含むブログを見る

体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践
- 作者: 徳丸浩
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2011/03/03
- メディア: 大型本
- 購入: 119人 クリック: 4,283回
- この商品を含むブログ (144件) を見る

PHP Hacks ―プロが教えるWebプログラミングテクニック
- 作者: Jack D. Herrington,牧野聡
- 出版社/メーカー: オライリージャパン
- 発売日: 2006/06/01
- メディア: 単行本
- 購入: 2人 クリック: 43回
- この商品を含むブログ (22件) を見る
![Laravelエキスパート養成読本 [モダンな開発を実現するPHPフレームワーク!] Laravelエキスパート養成読本 [モダンな開発を実現するPHPフレームワーク!]](http://ecx.images-amazon.com/images/I/61uL0Z-xpyL._SL160_.jpg)
Laravelエキスパート養成読本 [モダンな開発を実現するPHPフレームワーク!]
- 作者: 川瀬裕久,古川文生,松尾大,竹澤有貴,小山哲志,新原雅司
- 出版社/メーカー: 技術評論社
- 発売日: 2015/04/22
- メディア: Kindle版
- この商品を含むブログを見る