@Brice が言うように、PermGen の問題は、モック オブジェクトを多用することに起因します。Powermock と Mockito はどちらも、モックされるクラスとテスト コードの間に位置する新しいクラスを作成します。このクラスは実行時に作成され、PermGen にロードされ、(実質的に) 復元されることはありません。したがって、PermGen スペースに関する問題があります。
あなたの質問に:
1) 静的変数の共有は、コードの臭いと見なされます。場合によっては必要ですが、テスト間に依存関係が生じます。テスト A は、テスト B の前に実行する必要があります。
2) モック化されたオブジェクトを返すための静的メソッドの使用は、実際にはコードのにおいではなく、よく使用される atern です。本当に permgen スペースを増やすことができない場合は、いくつかのオプションがあります。
PowerMock#reset()
モックがプールに戻されるときに、モックのプールを使用します。これにより、作成している作成の数が削減されます。
第二に、あなたのクラスは最終的なものだとおっしゃいました。これが変更可能な場合は、テストで匿名クラスを使用できます。これにより、使用される permgen スペースの量が削減されます。
Foo myMockObject = new Foo() {
public int getBar() { throw new Exception(); }
}
第 3 に、インターフェイスを導入し (Eclipse で [リファクタリング] -> [インターフェイスの抽出] を使用)、それを何もしない空のクラスで拡張します。次に、クラスで上記と同様の操作を行います。読みやすいので、私はこの手法をかなり頻繁に使用します。
public interface Foo {
public int getBar();
}
public class MockFoo implements Foo {
public int getBar() { return 0; }
}
次に、クラスで:
Foo myMockObject = new MockFoo() {
public int getBar() { throw new Exception(); }
}
私はモッキングが特に好きではないことを認めなければなりません。モッキングは必要な場合にのみ使用し、匿名クラスでクラスを拡張するか、実際の MockXXX クラスを作成する傾向があります。この観点の詳細については、モッキング モッキングと結果のテストを参照してください。ボブおじさん
ちなみに、Maven Surefire では、いつでもforkMode=alwaysを実行できます。これにより、各テスト クラスの jvm がフォークされます。ただし、これで Eclipse の問題は解決しません。