• ベストアンサー

JUnitでのプライベートメソッドのテストについて

JavaSE6で開発をしております。 eclipse3.6を用いて、JUnit3でテストを行っているのですが、 クラスのプライベートメソッドをテストするにはリフレクション以外の方法はないのでしょうか。 リフレクションを使う方法ですと、テストコードが複雑になりがちで、publicメソッドに比べると、テストするのがしんどいです。 JUnit3に限らない、他のテストフレームワークでも構いませんので、プライベートメソッドをテストする、よい方法はないものでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.1

なんでprivateなメソッドをテストしなくちゃいけないのか という問題があるけど テストはリフレクション必須ね JUnit-addonsを使えば PrivateAcceccorクラスがあるので これを使えばコードがすこしすっきりするわ

hiropon_su
質問者

補足

回答ありがとうございます。 プライベートメソッドをテストしたかったのはriverotterさんの指摘にもある通り、クラスの共通内部処理の動作確認をしたかったからです。 できるだけ、publicメソッドのテストだけで済むように、リファクタリングを検討するとともに、どうしても必要な場合は、PrivateAccessorを試してみようと思います。

その他の回答 (1)

回答No.2

そもそも、なぜプライベートメソッドを用意してるのでしょうか? クラスの拡張などを考慮するとprotectedにした方が良いメソッドも結構あると思います。 本末転倒ですが、もしprotectedにできるなら、protectedメソッドに変更するのも一つの手です。。 プライベートメソッドって、クラス内の共通処理として書いていることが多いと思います。言い方を変えれば、全てのプライベートメソッドは他のメソッドの一部として記述されます。 なので(あくまで私の今までの経験からですが)、publicメソッドのテストケースは関連するprivateメソッドをすべて通るように用意します。 もしそうする事で、一つのメソッド(もしくはクラス)のテストケースが膨大な数になるようでしたら、メソッドやクラスが複数の責務を無理やり一つにまとめているような場合もありますので、一度リファクタリングを検討してみた方が良いと思います。 こういったクラスは、製造時に一生懸命頑張って作ってテストしても保守フェーズで問題になることが多いので、可能であれば製造、単体テスト時点で見直すのがベストです。

hiropon_su
質問者

お礼

回答ありがとうございます。 プライベートメソッドをテストしたかったのはご指摘の通り、クラス内の共通処理の動作確認をしたかったからです。 本来は設計の段階で細かく切り分けた方がよいのでしょうが、 設計の経験値が足りず、ひとつのクラスで動くものを作ってからリファクタリングで切り分ければようとしていました。 そのため、プライベートメソッドが増えてしまい、publicメソッドのテストだけでは、原因がわかりにくくなっていたので、プライベートメソッドのテストケースを書くようになっていました。 回答のおかげで、そもそもプライベートメソッドをテストしなければならない状況がよろしくないことがわかりました。 リファクタリングで、機能の切り分けを検討したいと思います。

関連するQ&A