• ベストアンサー

JUnitの仕組みについて

JUnitではtestと名前のついたメソッドに対して、そのメソッドの前にsetUp()とtearDownメソッドを挟んで実行することができますが、その仕組みはどうやっているのでしょうか?この仕組みを知ればアスペクトプログラミングをXMLなしでできるのではないかと思いまして、、 よろしくお願いいたします。

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

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

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

まったくの推測ですが、単にsetUp()を呼んでからテストメソッド群を呼んで、 そのクラスのテストが終わったらtearDown()を呼ぶ、という動作をリフレクションか何かでやっているだけだと思いますよ。 アスペクト指向のような振る舞いはなくともJUnitの動作は説明できます。 たとえばJUnitではテストメソッドはJUnitが自動的に呼び出してくれますが、 ユーザがわざわざテストメソッドを呼び出すコードを書いたとしましょう。 そのときに勝手にsetUp()の呼び出しをJUnitが付け加えていたら、それはアスペクト指向的な動作だと思います。 しかしユーザがテストメソッドを直接呼んだのにJUnitが勝手にsetUp()やtearDown()を付け加えたりはしません。 アスペクト指向とは無関係だと思います。

nonJump
質問者

お礼

お礼が遅くなって申し訳ありませんでした。 不勉強のためリフレクションという機構をはじめて知りました。 動的にメソッドを指定するのをどうやるのか いつも疑問に思っていたのですが、これで解決です。 ご親切にありがとうございました。

その他の回答 (1)

回答No.1

Junitのソースファイルを見れば分かると思います。

関連するQ&A

  • Junitについて

    junitを利用してテストするというのは、あるメソッドに引数を あたえてその戻り値が正しい結果であるかとい事を判定するためのツールなのでしょうか 実践的なjunitのテストケースについて参考となる本やサイトはないでしょうか ※Junitと単体テスト技法という本は読みました。 (DBを利用したテストケースなどを勉強したいと思っています。)

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

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

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

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

    • ベストアンサー
    • Java
  • AntでのJunitの試験

    Antのbuild.xmlを下記のように記述して、Ant unit-testを実行させると、下記の[junit]の試験がFAILEDになってしまいます。これと同じJunitの試験はEclipse上のJunitの試験ではパスしていますので、Javaのテストプログラムそのものには間違いはありません。(同じファイルを使っています。) レポートファイルのエラーを見てみると、initializationErrorで、 org/hamcrest/SelfDescribing java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:800) at java.lang.ClassLoader.loadClass(ClassLoader.java:358) at java.lang.reflect.Constructor.newInstance(Constructor.java:526) Caused by: java.lang.ClassNotFoundException: org.hamcrest.SelfDescribing at java.lang.ClassLoader.loadClass(ClassLoader.java:358) のようなエラーをはいていますが、理由が分かりかねています。 Antは、apache-ant-1.9.2、Junitは、juint-4.11.jarを使っています。 多分、下記xmlファイルの<junit>の書き方の問題ではないかと思うのですが、 AntのJunitの試験に詳しい方でお分かりになる方ございましたらアドバイスをお願いします。 <?xml version="1.0" encoding="UTF-8"?> <project> <property name="output" value="build/output"/> <target name="compile"> <mkdir dir="${output}/classes"/> <javac srcdir="src" destdir="${output}/classes"/> </target> <target name="unit-test" depends="compile"> <path id="for-unit-test"> <pathelement location="${output}/classes"/> <pathelement location="${output}/test-classes"/> <pathelement location="build/lib/junit-4.11.jar"/> </path> <mkdir dir="${output}/test-result"/> <mkdir dir="${output}/test-classes"/> <javac srcdir="test/src" destdir="${output}/test-classes"> <classpath refid="for-unit-test"/> </javac> <junit> <classpath refid="for-unit-test"/> <batchtest todir="${output}/test-result"> <fileset dir="test/src"> <include name="**/*Test.java"/> </fileset> <formatter type="xml"/> </batchtest> </junit> <junitreport todir="${output}/test-result"> <fileset dir="${output}/test-result"> <include name="TEST-*.xml"/> </fileset> <report format="frames" todir="${output}/test-result/report"/> </junitreport> </target> </project>

    • ベストアンサー
    • Java
  • AntでのJunitの試験(II)

    先ほどの「AntでのJunit試験」の続きです。(ベストアンサーを押してしまったため、返信が受けられなくなったため、新規にたちあげました。) 情報ありがとうございます。 ご指摘のように、EclipseのUnitテストで使っている、org.hamcrest.coreのjarファイルを build\libの下に置いて走らせるとJunitの試験はパスするようになりました。 ありがとうございました。 後、ひとつだけ分かれば教えていただきたいのですが、 現在、コマンドプロンプトのbuild.xmlが置いてあるディレクトリから、>Ant unit-test を実行すると、Junitの試験はパスして、<junitreport>の記述でテスト結果をはいてくれて全て OKなのですが、 Eclipseのアウトラインからunit-testを右クリックして->実行->Antビルド を実行させると、Junitの試験はパスするのですが、<junitreport>の所で、 Error! staticでないJava関数'replace'の最初の引数は無効なオブジェクトの参照です。 Error! スタイルシートをコンパイルできませんでした。 Fatal Error! データ型'void'を'reference'に変換できません。Cause: データ型'void'を'reference'に変換できません。 となって、テスト結果のはき出しには失敗してしまうようなのです。 コマンドプロンプトで実行した場合は、ant-1.9.2を使っているのですが、Eclipseのデフォルトの プラグインのものはant-1.8.4のものを使っているようです。 Antタスクのjunitreportが使えるAntのヴァージョンのようなものがあるのでしょうか? また、1.8.4でもjunitreportが使えるような書き方とかあるのでしょうか?

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

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

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

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

    • ベストアンサー
    • Java
  • Junit Testの時privateで宣言したメソッドのテスト方法

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

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

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

  • JUnit4のアノテーションについて

    おおもととなる1つのテストケース(仮にA.class)内に対して、 @RunWith(Enclosed.class)アノテーションで、 複数のテストケース(仮にB.class、C.class)を、入れ子記述しています。 その中にある1つのテストケース(仮にB.class)で、 さらに、 @RunWith(Parameterized.class)アノテーションと、 @Parametersアノテーションを利用して、 テスト対象メソッドに渡す引数と期待値だけが異なるテスト (戻り値はCollectionで、Collectionの要素はObject配列とする) を複数回実行しています。 上記した1つのテストケース(仮にB.class)で、 Eclipse3.6上のJUnit4におきましては、 その1つのテストケースだけで 単体実行した際には、 全ての結果がOKになります。 しかし、 他にも存在している複数のテストケース(仮にC.class)とまとめて、 おおもととなる1つのテストケース(仮にA.class)から 実行した際には、上記した1つのテストケース(仮にB.class) でのみ、以下のJUnit4エラーが発生しています。 java.lang.Exception; No runnable methods at java.lang.reflect.Constructor.newInstance(UnKnown Source) このエラーを解消するには、どうすればよいでしょうか? (コンストラクタをインスタンス時のエラーのようでしたので、  以下に、コンストラクタ箇所を添付しておきます) public B( final String str_inTestData1, final int int_inTestData2, final int int_inTestData3, final int int_inCnt) { this.m_str_inTestData1 = str_inTestData1; this.m_int_inTestData2 = int_inTestData2; this.m_int_inTestData3 = int_inTestData3; this.m_int_inCnt = int_inCnt; } @RunWith(Enclosed.class)アノテーション内に対して、 ネストで作成したサブのテストケース用クラスに対しては、 @RunWith(Parameterized.class)アノテーションと、 @Parametersアノテーションを利用することは 出来ないというような制限などがあるのでしょうか? 以上です。よろしくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう