djUnitコンストラクタがprivateでテストが行えない

このQ&Aのポイント
  • djUnitを使用している際に、テスト対象のメソッドにアクセスできない問題が発生しました。
  • その原因は、コンストラクタがprivateに設定されていることです。
  • コンストラクタを変更せずにdjUnitでテストを行う方法が分かりませんでした。
回答を見る
  • ベストアンサー

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
  • 回答数6
  • ありがとう数8

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

  • ベストアンサー
回答No.3

こんにちは。 済みません・・・、さっぱり意味がわかりません。 >testCreate(fileA, fileB, fileC); どこから呼べるの??? TestManagerクラスからは呼べるだろうけど、外部からは呼べない。 TestManagerが内部的に使うだけの目的で作ったpublic関数なら、単独ではテストの仕様がない。 それだったら public Structure testCreate(byte[], byte[], byte[]) がそもそもおかしいという話になるが・・・。 例えば public TestManager getInstance(){return new TestManager();} とか無いの?

daiou5
質問者

お礼

再度のご回答ありがとうございます。 >どこから呼べるの??? DJUNITのメソッドからです。 実際のソースであるコンストラクタのprivateを外せば、DJUNITのテストケースを書いたメソッドから呼べます。 private TestManager target = null; this.target = new TestManager(); Structure result = target.testCreate(ファイルパス, ファイルパス, ファイルパス); こんな感じで呼ぶことができますね。 あと、コンストラクタにprivateがついてても、 テスト対象のメソッドを呼べる方法を教えてくれてありがとうございます。 getInstanceというものを使うのですね。 このような方法を知りたかったのです。 これでうまくいきそうです。

その他の回答 (5)

回答No.6

dJUnit以前に、JUnitの正しい使い方を学ぶところから始めるべきです。 JUnit開発者の Kent Beck は、自らが提唱したTDDを普及させ、世のプログラマをテストのような非創造的作業から開放させたいと考えてJUnitを作った訳で、テスト・カバレジを上げる為に JUnit を作った訳ではありません。 TDD は、その過程において、リファクタリングを行うことを、強く推奨します(リファクタリングも、Kent Beckが考案し、Kent Beckの教えを受けたMartin Fowlerが書籍の形にしたものです)。 「TDDとリファクタリング」の精神を理解せずに、JUnit を使用することは、ほとんど無意味です。 JUnitを用いてTDDを行う際に、「設計仕様として記述したテストコード」を通るような製品クラス(たとえば、Exampleクラス)のコンストラクタをprivateにする事は、普通にあります。 たとえば、コンストラクタがpublicであれば、new Example()一行で済むような処理を、あえて次のように行います。 (1)Exampleのコンストラクタをprivateにする (2)Exampleのコンストラクタをラップするpublicなstaticメソッド(こういうメソッドのことを、static factory methodと言います)Example.create()を作る (3)Example.create()メソッドをラップする、privateなインスタンス・メソッド(非staticメソッド)createExample()を、ExampleTestクラス内に作る (4)JUnitのsetUp()メソッド内で、createExample()メソッドを呼ぶことにより、Exampleオブジェクトを生成する 何でこんな、一見メンドクサイことをするかと言うと、Exampleクラスのコンストラクタのコード内に、「そのコンストラクタが純粋に本来持つべき機能」以外のコードが混入されるのを回避する方法を提供しているのです。 こうした方法を提供することにより、「関心の分離」(オブジェクト指向の言葉で更に特定すると、"Week Coupling")の実現を目指している訳です。 なぜ、"Week Coupling" を実現する必要があるかについては、デザインパターン(の思想)を勉強する必要があります。

daiou5
質問者

お礼

ご回答ありがとうございます。 なるほど。全部は理解できていませんが勉強になりますね。 普通の使い方(テストケースの記述、モックの使い方、実行、判定)は分かるのですが、 この時はコンストラクタがprivateの場合にどうアクセスするかだけが分からなかったのです。 細かい勉強に関しては、 期間に限りがありすぐに対応しなければいけなかったので、 質問させていただいた時は初期から勉強というのが出来ない状態でした。 時間があるときにじっくり見ていきたいと思います。

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

getInstance相当のメソッドが TestManagerに あればできるって言う意味よ!? あればそれで良いけど。 ないとしたら本当になぞなクラスね。 利用できないクラスなんて何のために作ったのかしら。

daiou5
質問者

お礼

お返事遅くなってしまい、すみません。 ありがとうございます。 他の方のところで回答したとおり、ありました。 コンストラクタがprivateだったパターンが今回初めてだったもので 今までの経験での呼び方とは記述方法が違ったんですよね。 元々どこかから呼ばれて動いていたソースなので利用はされていましたね・・・。 (ただ、似たようなソースがごちゃごちゃあり分かりづらかったです) 自分はそれを含めた形で、(JUNITからはどう呼ぶんだろう?と)質問してしまっていたので説明不足でしたね。

回答No.4

こんにちは。 >>どこから呼べるの??? >DJUNITのメソッドからです。 そうじゃなくて・・・、このメソッドはそもそもどういう使われ方をしてるのかが知りたかったんですが・・・。 DJUNITからはコンストラクタのprivateを外さないと呼べないでしょ? もともとprivateコンストラクタのクラスなので、そのメソッドがどんな利用法なのかを教えて欲しいのですが・・・。 まぁ、うまく行くならいいんですが・・・。

daiou5
質問者

お礼

その節はありがとうございます。 教えていただいた方法でうまくいきました。 もちろん既存のシステムで動いているのでどこかから同じように呼ばれていたのだと思います…。 どんな利用法なのかをお聞きになっていたのは、 それが分かればDJUNITでも同じように利用すればいいんだよ、ということを伝えたかったのですよね。

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

そのtestCreateメソッドって どうやって使われるの? その方法があるならその方法でアクセスすればいいの。 それがないなら使えないメソッドなんてテストする必要ないわ。

daiou5
質問者

補足

>その方法があるならその方法でアクセスすればいいの。 その方法が分からなかったので、ご教授していただきたく質問させていただきました。 質問の仕方も悪く、また未熟なものですみません・・・。 >それがないなら使えないメソッドなんてテストする必要ないわ。 そういうわけにもいかないものでして…。 ありがとうございます。

回答No.1

こんにちは。 コンストラクタがprivateだったら、staticメソッドとかじゃないんですか? 自分のインスタンスを返すようなメソッドがあるとか・・・? public Structure testCreate(byte[], byte[], byte[]) これ、そもそもどうやって呼ぶの?

daiou5
質問者

補足

こんにちは。 ご質問にお答えさせていただきますね。 >コンストラクタがprivateだったら、staticメソッドとかじゃないんですか? それがpublicメソッドなんです。 >自分のインスタンスを返すようなメソッドがあるとか・・・? これについては、頭が悪いためか意味が分かりません。すみません・・・。 もう少し詳しく言っていただけると助かります。 >これ、そもそもどうやって呼ぶの? こんな感じで呼べます。 byte[] fileA = FileUtil.read( new File("ファイルパス")); byte[] fileB = FileUtil.read( new File("ファイルパス")); byte[] fileC = FileUtil.read( new File("ファイルパス")); testCreate(fileA, fileB, fileC);

関連するQ&A

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

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

    • ベストアンサー
    • Java
  • コンストラクタからメソッドを呼んではいけない?

    会社の先輩から、 「コンストラクタでメソッドを呼ぶな!」をいわれ 理由も聞かずにソースを修正したのですが、 なぜコンストラクタからメソッドを呼んではいけないのでしょうか? 例: public class MyClass{ public MyClass(){ test(); } private void test(){ System.out.println("test"); } } よろしくお願いします。

    • ベストアンサー
    • Java
  • エラーの理由が分りません。Private' であるため…?

    データを構造体で管理したいと思って、class testclassというクラスを作成しました。 それをtest2clsssで使うと思っているのですが、次のようなエラーが出ます 'testclass.code' は 'Private' であるため、このコンテキストではアクセスできません。 ソースは次のようなものです。 Public Class testclass Dim code As String End Class Public Class test2class Private Sub testsub() Dim test As New testclass test.code = "data" '←test.codeが駄目と言われる End Sub End Class subをPublicにしても同じエラーが出ています。 エラーの意味・原因は何で、どうすれば修正できるのでしょうか? よろしくお願いします。

  • VB2008: 継承の場合のコンストラクタの書き方?

    ' ================================================================== ' クラス TEST1 ' ================================================================== <Serializable()> Public Class TEST1   Private _Member1 As String   Private _Member2 As String   ' //   ' // パラメータを持つ初期化   ' //   Public Sub New(ByVal aMember1 As String, ByVal aMember2 As String)     _Member1 = aMember1     _Member2 = aMember2   End Sub End Class ' =========================== ' クラス TEST1 の派生クラス ' =========================== <Serializable()> Public Class NEWTEST1 Inherits TEST1 Private _Member1 As New TEST1 Private _Member2 As New TEST1 End Class これでもOKかと思うのですが・・・。 パラメータ化されていないコンストラクタをクラス TEST1 に書くように促すエラーがでます。 もちろん、パラメータを持たないコンストラクタを用意すればエラーは回避できます。 問題は、「Visual Basic のプログラミングガイド」からその理由を読み取れないことです。 >Visual Basic のオブジェクトの概要 >クラスについて >オブジェクトの作成と使用 まだ、ここしか読んでいません。 が、どうにも気になったので質問します。 1、エラーの回避策としては何が正しいのか? 2、その根拠は? この2つが知りたいです。

  • 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
  • PHPでサブクラスからスーパクラスのprivate

    メンバにアクセスできる件について PHPでスーパークラスで定義したprivateのメンバにサブクラスからアクセスできる件について 質問です。 class TestClass { private $value01 = "スーパークラスの private メンバ"; public function testMethod01 () { print "スーパークラスのパブリックメソッド"; print "<h1>{$this->value01}</h1>"; } protected function testMethod02(){ print "スーパークラスの protected メソッド"; } private function testMethod03(){ print "スーパークラスの private メソッド"; } public function getMethodList(){ print_r(get_class_methods($this)); } } class ExClass extends TestClass{ private $value01 = "サブクラスの private メンバ"; } $obj = new ExClass(); $obj-> testMethod01(); と上記のようにサブクラスのインスタンスから継承したpublicなメソッド testMethod01()を実行すると スーパークラスのprivateなプロパティにアクセスできてしまいます。 これってどういうことでしょうか?privateメンバってそのクラスの中からだけしかアクセスできませんよね? 上記では、サブクラスからアクセスしているような状態にみえますがどういうことでしょうか? ご教授御願い致します。

    • ベストアンサー
    • PHP
  • privateのメンバ変数を直接取得するユーティリティ。

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

    • ベストアンサー
    • Java
  • コンストラクタの使い方?

    僕はまだJavaを勉強し始めて1ヶ月ぐらいの初心者なんですけども、現段階では基本的な文法を勉強し終えた(かなと思っている)ので、Swingのほうに早速とりかかりました。その際にすごく疑問に思ったことがあるので、皆さんにお尋ねします。 public class A ......main..... class B extends Frame{   public B(String stitle){    super(stitle);  } } super(stitle)のところでFrameクラスのコンストラクタが呼び出されていますよね。そこでFrameクラスのコンストラクタの定義を見てみると、僕が今まで学んできたような定義がなされていないんですけども。僕が今まで学んできたものというのは、 class Car {   private int num;   private double gas;   public Car()   {    System.out.println(車を作成しました。)   } } class C { ....main...   {    Car car1=new Car();   } } この場合の実行結果というのは、 「車を作成しました。」という文章が表示されはづですけど、これって言うのはSystem.out.println(車を作成しました。)のようにきちんと定義しているからですよね。それに対してFrameクラスのコンストラクタの定義には説明はあるものの、実行処理するための定義がされていないような気がするんですけども・・・。まだ僕はオブジェクト指向というものを理解できていないから、このようなわけのわからない質問をしている(と思う)のですが、よろしければどなたか分かりやすく教えてください。

    • ベストアンサー
    • Java
  • クラスを配列で確保する場合のコンストラクタへの引数の渡し方

    例えばコンストラクタのオーバーロードで以下のようなクラスを宣言したとします。 class testClass{ public: testClass(void){ num = 10; } testClass(int num1,int num2){ num = num1 + num2; } int num; }; オブジェクトとして宣言する場合 testClass obj(10,10); と定義とすれば、testClass(int num1,int num2)の方が適用されobj.num = 20となり、問題ありませんが、ここでobjを複数定義したい場合、obj[10]と定義すると上手く引数を渡す事ができません。 以下のような形で宣言するという手もありますが testClass obj[2] = {testClass(2,2),testClass(2,2)}; 例えば定数NUMと定義しておき、 testClass obj[NUM]; という形で宣言したい場合、どのようにすればよいでしょうか? よろしくお願いします。

  • C#のキャストについて(object→byte)

    いつもお世話になっております。C#初心者です。 「メソッドの引数として渡された値をリスト型の配列に格納する」という課題に取り組んでいますが、 変数のキャストで実行時にエラーが発生し、頭を悩ませています。 作成したコードは以下のようになっています。 public class TestClass {  private List<byte> hogeList = new List<byte>();  public void TestMethod( object hoge )  {   hogeList.Add( (byte)hoge ); ← (*)  } } 上記のメソッドをMain関数から TestClass test = new TestClass(); test.TestMethod(5); として実行すると、「hogeList」に「5」が格納される、といった動作にしたいと考えています。 しかしながら、ビルドは通るのですが、実行すると(*)の位置で止まり、 「指定されたキャストは有効ではありません。」 というメッセージが表示されます。 そこで質問なのですが、object型からbyte型にキャストする場合にはどのような記述の仕方がありますでしょうか? ご教授よろしくお願いいたします。

専門家に質問してみよう