Java に対する私のモットーは、「Java には静的ブロックがあるからといって、それを使用する必要があるという意味ではありません」です。冗談はさておき、Java にはテストを悪夢にするトリックがたくさんあります。私が最も嫌いなのは、匿名クラスと静的ブロックの 2 つです。スタティック ブロックを利用するレガシー コードが多数ありますが、これらは単体テストの作成を推進する際の厄介なポイントの 1 つです。私たちの目標は、最小限のコード変更で、この静的初期化に依存するクラスの単体テストを記述できるようにすることです。
これまでのところ、私の同僚への提案は、静的ブロックの本体をプライベートな静的メソッドに移動し、それを呼び出すことstaticInit
です。このメソッドは、静的ブロック内から呼び出すことができます。単体テストでは、このクラスに依存する別のクラスをJMockitstaticInit
で簡単にモックして、何もしないようにすることができます。これを例で見てみましょう。
public class ClassWithStaticInit {
static {
System.out.println("static initializer.");
}
}
に変更されます
public class ClassWithStaticInit {
static {
staticInit();
}
private static void staticInit() {
System.out.println("static initialized.");
}
}
JUnitで次のことができるようにします。
public class DependentClassTest {
public static class MockClassWithStaticInit {
public static void staticInit() {
}
}
@BeforeClass
public static void setUpBeforeClass() {
Mockit.redefineMethods(ClassWithStaticInit.class, MockClassWithStaticInit.class);
}
}
ただし、このソリューションには独自の問題もあります。実際には静的ブロックを に対して実行したいので、同じ JVM でDependentClassTest
とを実行することはできません。ClassWithStaticInitTest
ClassWithStaticInitTest
このタスクを達成するためのあなたの方法は何ですか? または、よりクリーンに動作すると思われる JMockit 以外のより優れたソリューションはありますか?