• ベストアンサー

Junit Testの時privateで宣言したメソッドのテスト方法

お疲れ様です。 junitテストクラスの作成する時 まずテスト対象のクラスをobject生成しますが、 privateで宣言してるメソッドはobject生成後も呼べないから どうやってテスト出来るか分かりません。。。。

  • Java
  • 回答数2
  • ありがとう数3

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

  • ベストアンサー
  • HarukaV49
  • ベストアンサー率53% (48/89)
回答No.2

>privateで宣言してるメソッドはobject生成後も呼べないから おっしゃるように、基本的にprivateなメソッドは外部クラスからは 呼べないわけですから、junitテストで独立に呼び出してテストする 必要(意味)がないというのがUnitTestの考え方だと思います。 あるオブジェクトの全てのpublicメソッドをテストすれば、 その内部にコーディングされているprivateメソッドは、間接的に必ず 最低1度は実行されるはずですから、同時にテストされているということです。 (どのprivateメソッドが呼ばれるかを意識してテストケースを記述する) 逆に、privateなメソッドをリフレクション等を使って直接呼び出してしまうと、 publicメソッドから(間接的に)呼ばれる場合には、(通常の実行状態では) ありえない引数を渡すことも可能になりますので、UnitTest自身の信頼性がなくなります。

その他の回答 (1)

  • yuji
  • ベストアンサー率37% (64/169)
回答No.1

私は、リフレクションを使ってprivateのメソッドのテストを 行っています。

関連するQ&A

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

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

    • ベストアンサー
    • Java
  • JUnitのテストメソッドごとのメモリの確保とかの話

    JUnit関連の少しコアな話になります。 JUnitではデフォルトでは、実行する際初期処理としてまずテストクラス内のテストメソッドの数だけテストクラスをインスタンス化し、その後各テストメソッドを実行していく、という仕様になっているようです。そしてかつ、各インスタンスはテストクラス内のすべてのテストメソッドが終了するまでインスタンスの破棄は行わないようです。 上記の仕様であるはずだと言う根拠は、テストクラスにコンストラクタを作成し、そこにsysoutを記述することにより確認をしました。 上記の仕様であることが主原因で、Out of Memoryが発生してしまいます。 他にそうなってしまう原因はいくつかあって ・Springを利用していて初期化にメモリを結構使う ・テスト対象のクラスが複雑でテストメソッドの数が多くなる ・パソコンの物理メモリに限界がある ・DJUnitでカバレッジを調査することもあり、またテスティングペアの名前は統一したいので、テスト対象クラスとテストクラスを1対1に対応させたい。 などが挙げられます。VMの実行メモリを大きくしたり、テストクラスを分割してしまうなどの対処療法を行ってきましたが、何とか主原因をつぶす方法は無いものかと質問をした次第です。 (その他、使用しなくなったオブジェクトにnullをセットしたり明示的にgcの実行を指示する等の苦肉の策を行いましたが、ほとんど影響しませんでした) 前置きが長くなりましたが質問は、JUnitでテストを行う際、テストクラス内のテストメソッドの数だけインスタンス化しているものを、あるテストメソッドを実行する直前にインスタンス化し、そのテストメソッドが終了したらそのインスタンスを破棄するような設定はないのか、あればその方法を教えてほしい、ということになします。 だいぶ分かりにくい説明かもしれませんが…。 以上よろしくお願いします。

    • ベストアンサー
    • Java
  • 抽象クラスをJUNITでテストする方法

    抽象クラス内に実装メソッドと抽象メソッドがある場合に、 そのクラスをJUNITでテストしたいと思っています。 通常のクラスであれば、そのクラスに対するテストクラスを 作成して、テストクラス内でテスト対象クラスをnewして テストケースを記述していくと思いますが、 上記のような抽象クラスの場合は、 どういった形でテストクラスを作成すれば良いのでしょうか? 抽象クラスはnewできないので、 抽象クラスを実装したクラスをまず作成して そのクラスに対するテストクラスを作成するのでしょうか? お薦めの方法や一般的な方法があれば教えてください。 以上、よろしくお願い致しますm(__)m 【環境】 JDK1.4.2 JUNIT3.8.1

    • ベストアンサー
    • Java
  • privateのメソッドをリフレクションで呼び出す方法

    privateのメソッドをリフレクションで呼び出す方法 private のメソッドをリフレクションで呼び出す方法 privateのメソッドもリフレクションというもので呼び出せると聞きましたが、やり方がよく分かりません。 aaaやbbbクラスのインスタンスを生成したいのですが、privateやpackage privateのため、そのままだとインスタンスが生成できません。 forNameメソッドやnewInstanceメソッドでどうにかできないかと試してみたのですが、イリーガル例外が発生してしまいます。 何かよい方法がないでしょうか? aaa, bbbのクラスを継承してモックを作成する方法もあるのですが、今回はそういった方法ではなく、privateやpackage privateメソッド(特にコンストラクタ)を外部から呼び出す方法がよいです。 public aaa { private aaa() { } private func() { } } public bbb { aaa() { } private func() { } }

    • ベストアンサー
    • Java
  • djUnit コンストラクタがprivateでテストが行えない

    djUnit コンストラクタがprivateでテストが行えない djUnitを使っております。 テスト対象のメソッドにアクセスしてテストを行いたいのですが、 どうもそれができません。 理由としては、コンストラクタがprivateになっているから?です。 (「コンストラクター TestManager() は不可視です」というエラーが出ます。) コンストラクタのprivateを消せば、テスト対象のメソッドにアクセスできるのですが、 実際には消してテストをしてはだめということになっています。 コンストラクタがprivateでもdjUnitでテストが行える方法がございましたら、 書き方をご教授いただけないでしょうか? どうかよろしくお願いいたします。 一応下記が詳細です。 (クラス名、コンストラクタ名、メソッド名) ------------------------ [クラス] public final class TestManager [コンストラクタ] private TestManager() { } [テスト対象のメソッド] public Structure testCreate(byte[], byte[], byte[]) ----------------------- 色々試したのですが、途中で終了してしまって 目的のテスト対象のメソッドを実行するところまで辿りつけません・・・。 [お試しパターン1] Class c = TestManager.class; Constructor[] con = c.getDeclaredConstructors(); TestManager conIns = (TestManager)con[0].newInstance(); //ここで処理が終了してしまう [お試しパターン2] Class testClass = Class.forName("TestManager"); //ここで処理が終了してしまう Constructor[] TestManager = testClass.getDeclaredConstructors(); TestManager[0].setAccessible(true); Object conIns = TestManager[0].newInstance((Object[])null); TestManager test = (TestManager)conIns;

    • ベストアンサー
    • Java
  • Junitテストでvoid戻り値メッソドをテストする方法

    お疲れ様です。 Junitテストでvoid戻り値メッソドをテストする方法について質問が あります。 戻り値なしのvoidメソッドをassertで検査したい場合どうしたら いいでしょうか。 ただexceptionとかが無く動いたら良いだけです。 お答えお願いします。

    • ベストアンサー
    • Java
  • JUnitのテスト結果の取得方法

    昨日でプロジェクトも一段落つき、現在eclipse + JUnitプラグインでテストする勉強をしています(遊んでる!?) そこで、テストをする材料として今回プロジェクトで作成されている共通クラスを使用していました。 で、全角英数記号文字を半角英数記号文字に変換するメソッドがありテストを書こうとして考えてしまいました。 ”→"と返ってくるはずなのですが、 aasertEquals(""",戻り値)と記述出来ませんよね? このような場合、どうすればいいのでしょうか? まあ、JUnitだけにかかわる問題でもないでしょうし、一般的な事なのかもしれませんがご指導ください。

  • privateのメンバ変数を直接取得するユーティリティ。

    privateのメンバ変数を直接取得するユーティリティ。 以前、あるプロジェクトでクラスのprivateメンバ変数をgetterメソッドがないのに直接取得できるクラスを使っているのを見ました。 オブジェクトとメンバ変数とかを引数に渡すと、Object型で返却されるようなテスト用のユーティリティクラスみたいでした。 クラスやパッケージなどを確認しなかったので、もしかしたらそのプロジェクトで独自に作ったのかもしれません。 ただオープンソースとかで存在するのであればテストに便利なので利用したいと考えています。 できればsetterメソッドがないprivateメンバ変数に設定できるクラスがあるとよいのですが・・・。 ご存知でしたら是非おしえてください。 希望している経緯はWebアプリケーションのクラスを作成すると、コンテナのオブジェクトがないと動かない場合も多く、単体試験がやりにくいのです。 easymockなど色々ありますが、生成したオブジェクトを対象クラスに渡してあげる必要があるものが多く(staticメソッドは対象外とか)、テストのためにsetterメソッドを実装する必要があります。 個人的には単体試験をやりやすくするために、本番では使用しないメソッドになるけれど、上記のようなsetterメソッドを作成するのはよいと考えています。 依存性を少なくさせて(意味が違うかもしれませんが)、試験がしやすくなれば保守性もあがるし、バグの発生率も少なくなると思っています。 ただ人によっては本番で動かないメソッドがあるのはおかしいという人もいます(実際に言われました)。 確かにそういう考えもあるかと思いますし、以前は私もそう思っていました。 試験のためのメソッドをクラスに作成する考えについても(主にテスト用なのでprotectedで作成しています)、やめた方がいいなどのアドバイスを頂けると嬉しいです。

    • ベストアンサー
    • Java
  • method宣言に変数等を使って可変に宣言できるか

    method宣言時にmethod名に変数を利用して宣言する事はできるのでしょうか? ↓こんなような感じで $fuga = "test"; public function {$fuga}hoge() {  .... }

    • 締切済み
    • PHP
  • ◆完全に、privateなメソッドにしたい

    クラスA内に、 privateで、staticなメソッド「hogehoge」を作った時、 完全に、「hogehoge」の中の変数・Inputパラメータ、Outputパラメータだけで処理をさせたいです。 ◆具体例:(こういうのをできないようにしたい) クラスA.h static 変数X static 変数Y static メソッド hogohoge (略) クラスA.cpp メソッド hogohoge (略) { z = 変数X + 変数Y } //---------------------------------- ◆やりたいこと メソッド上のように、変数Xや、変数Yにアクセスできてしまうのを、制限したいのです。  例えば、pragmaとかを書いて、オプションで制限できたりできないでしょうか? 完全に、「hogehoge」の中の変数・Inputパラメータ、Outputパラメータだけで処理をさせたいです。 また、今回はstatic 変数だけを引き合いに出しましたが、  他にも「実はアクセスできちゃうんだよね」というものがあれば、  (例えばdefineとか?) ご教授頂けるとさらに嬉しいです。 .