privateメソッドのテスト

privateメソッドをJUnitでテストしたい!という状況が出てきたので、その方法について調べてみる。まず単純に思いつくのは、

  1. リフレクションを使う
  2. 一時的にアクセス権を緩める

の2通り。2番目のやり方は面倒だしアクセス権を元に戻すのを忘れると悲惨なことになりかねないので余裕で却下。一方リフレクションを使う方法はコーディングが面倒になってしまうものの、JUnit-addonsなどを使えば楽に出来るようだ。
だが、ここの1978以下のスレッドとか、Unit Testing Non Public Member Functionsを読むと「privateメソッドまでテストする必要は無い」「privateメソッドをテストしたいと感じる場合、そもそもそのクラス設計に問題が無いか疑うべき*1」という意見が多い。結局今回はクラスを見直した結果、債務が大きくなりすぎていると感じたこともありクラスの分割を行うことにした。
でも、最近話題になってきているTDDのパラダイムでは、privateメソッドもガンガンテストしていくことになるのかな?TDDのことを大して知らないので、大きな勘違いをしているかもしれないけど。TDDについても勉強しないとなぁ。

*1:いわゆるCode Smell