privateメソッドのUnitTestについて、下記のような扱いがあると思う。
- スコープを(例えばprotectedに)拡張する
- 直接間接を問わず、リフレクションなどを活用してテストする
これらに対して、ずっと何か違和感を覚えていた。
実践JUnitでちょっと触れられている箇所があって、自分なりの読み解きで何となく向き合い方が腹落ちしたので書いておく。
- UnitTestはメソッドのテストではなく、そのふるまいのテストにより重きが置かれるべき
- privateメソッドは実装の内部詳細であり、その変更はふるまいに影響をあたえるべきではない
上記の前提を考えると、基本的にはpublicスコープに対してのテストで十分になりえるはず。
そのクラスのふるまいであるなら少なくともパッケージ以上にスコープが(テストのためではなく)拡張されることに違和感はない。
そうでないならば別のクラスに切り出すようなふるまいなのかもしれない。
結局のところ、privateメソッドの詳細に踏み込んだテストが必要になった時は、設計に何か問題がある可能性が高いということなのだと思う。
- 作者: Jeff Langr,Andy Hunt,Dave Thomas,牧野聡
- 出版社/メーカー: オライリージャパン
- 発売日: 2015/09/02
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (4件) を見る
追記
@t_wada さんにTwitterで参考記事を教えていただきました!
追記その2
@backpaper0 さんのブログ