- ベストアンサー
JUnitテストメソッドごとのメモリ確保とは?
- JUnitではテストメソッドごとにメモリを確保しています。
- テストメソッドが終了したらメモリを解放しています。
- テストクラス内のすべてのテストメソッドの実行後にメモリの破棄が行われます。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
やっつけで試してみたら成功しました。 JUnitのソースを変更します。 変更するソースは「junit.framework.TestSuite」です。 1.クラスに内部クラス「LazyInstance 」を追加 static class LazyInstance implements Test { Class clazz; String name; Test instance; LazyInstance(Class clazz, String name) { this.clazz = clazz; this.name = name; } public int countTestCases() { return 1; } public void run(TestResult result) { if (instance == null) { instance = realCreateTest(clazz,name); } instance.run(result); } } 2.メソッドcreateTestの中身をコピーしたstaticメソッド「realCreateTest」を追加 (長いので略しますが、createTestメソッドを丸々コピーしてメソッド名だけ「realCreateTest」に変えたものです) 3.メソッドcreateTestを以下のように修正 static public Test createTest(Class theClass,String name) { LazyInstance li = new lazyInstance(theClass,name); return li; }
お礼
なんかすごいですね…。 ライブラリの中身を変更するという考えは思い浮かびませんでした。 …で、試してみたのですが、うまく行きませんでした。コンストラクタにシスアウトを記述するとテストメソッド実行前にコンストラクタがテストメソッド分呼び出されていました。 私の記述ミスである可能性もあるので、もう少しゆっくり試してみます。ありがとうございました。 ちなみに困っていた現象は >Springを利用していて初期化にメモリを結構使う という部分で、使用するクラスをすべてインスタンスとして持つApplicationContextと呼んでいるインスタンスが10MBを超え、テストメソッドが50を超える場合に、実行メモリを500MBにしてもメモリが不足したという現象でした。 で、実はこの件に関しては、static変数に記述し、スレッドをたくさん作られてもインスタンスが1つしか存在しないようにすることにより回避することができました。 しかし、今回の質問の趣旨のJUnitの遅延初期化の話も将来的に使うかもしれない部分であるので、もう少し調べてみたいと思っています。
補足
記述の通りでできました。 エクリを使用していたため、複数のJUnitjarが存在していたのに気づかず、1つだけ消してそれで全て消したつもりになっていたことが原因でした。 kazsharpさんありがとうございました。