• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:djUnit コンストラクタがprivateでテストが行えない)

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

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

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

  • ベストアンサー
回答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