UnitTestでのprivateメソッドとの向き合い方

privateメソッドのUnitTestについて、下記のような扱いがあると思う。

  • スコープを(例えばprotectedに)拡張する
  • 直接間接を問わず、リフレクションなどを活用してテストする

これらに対して、ずっと何か違和感を覚えていた。
実践JUnitでちょっと触れられている箇所があって、自分なりの読み解きで何となく向き合い方が腹落ちしたので書いておく。

  • UnitTestはメソッドのテストではなく、そのふるまいのテストにより重きが置かれるべき
  • privateメソッドは実装の内部詳細であり、その変更はふるまいに影響をあたえるべきではない

上記の前提を考えると、基本的にはpublicスコープに対してのテストで十分になりえるはず。

そのクラスのふるまいであるなら少なくともパッケージ以上にスコープが(テストのためではなく)拡張されることに違和感はない。
そうでないならば別のクラスに切り出すようなふるまいなのかもしれない。

結局のところ、privateメソッドの詳細に踏み込んだテストが必要になった時は、設計に何か問題がある可能性が高いということなのだと思う。

実践 JUnit ―達人プログラマーのユニットテスト技法

実践 JUnit ―達人プログラマーのユニットテスト技法

追記

@t_wada さんにTwitterで参考記事を教えていただきました!

qa.atmarkit.co.jp

追記その2

@backpaper0 さんのブログ

backpaper0.github.io