phpでprivateなメソッドのテストを書く方法が知りたい

PHPユニットテストを書いています。PHPUnitというクラスを継承してできるのですが、なかなか扱いが難しいと思っているのがprivateなメソッドのテストです。

僕が思いついたのは以下のような順序です。

解決策

  1. privateメソッドのちゃんとテストできるテストケースを用意する
  2. publicなラッパーメソッドを書いてそれ経由でテスト
  3. テストのときだけprivate=>publicに変えてしまう
  4. 開き直って全部publicにして、メソッド名を「_」で始める
  5. テストしない

問題点

  1. できればベストだと思いますが、カバレッジに限界がある気がする。
  2. テストのためだけにpublicなメソッド作っちゃったらあまり意味がないし、面倒。
  3. 開発時は良いけど、リリース時に直し忘れたり、直した後テストが通らないからダメ
  4. 今こうしちゃってる。少人数だったらまぁ良いかなという気もするけど
  5. ダメだと思う

ググっているといろいろ悩んでいる方がいるようだし、これという方法はないのかなぁ。

Java では、AccessibleObject を使用することで、フィールドやメソッドに対するアクセス制御ができます。PHP でも、PHP 5.3.0 から、ReflectionProperty クラスに setAccessible() が追加され、プロパティ(フィールド)へのアクセス制御ができるようになったのですが、ReflectionMethod クラスには、setAccessible() は実装されていません。
そこで、ReflectionMethod クラスに setAccessible() を実装してみることにしました。
プライベートメソッドに対するテスト方法 - t_komuraの日記

この方法はちょっと気になるので時間のある時にちょっと試してみたいです。