私のモットーは「Javaには静的なブロックがあるからといって、それを使うべきではない」ということです。ジョークを除いて、Javaには悪夢をテストするためのたくさんのテクニックがあります。私が気に入っているのは、匿名クラスと静的ブロックです。スタティックブロックを使用する多くのレガシーコードがあります。これらは単体テストを書く上での迷惑な点の1つです。私たちの目標は、最小限のコード変更でこの静的初期化に依存するクラスの単体テストを書くことができるようにすることです。Javaの静的ブロックを擬似する
これまでのところ私の同僚の提案は、静的ブロックの本体をプライベート静的メソッドに移動し、staticInit
と呼ぶことです。このメソッドは、静的ブロック内から呼び出すことができます。ユニットテストのために、このクラスに依存する別のクラスは、何もしないためにstaticInit
をJMockitで簡単に嘲ることができます。例を見てみましょう。我々はJUnitの中で次の操作を実行できるようにするため
は
public class ClassWithStaticInit {
static {
staticInit();
}
private static void staticInit() {
System.out.println("static initialized.");
}
}
に変更されます。
public class DependentClassTest {
public static class MockClassWithStaticInit {
public static void staticInit() {
}
}
@BeforeClass
public static void setUpBeforeClass() {
Mockit.redefineMethods(ClassWithStaticInit.class, MockClassWithStaticInit.class);
}
}
ただし、この解決策には独自の問題もあります。静的ブロックを実際にClassWithStaticInitTest
に実行させたいので、DependentClassTest
とClassWithStaticInitTest
を同じJVM上で実行することはできません。
このタスクを達成するあなたの方法は何ですか?または、JMockit以外の優れたソリューションで、よりクリーンな作業ができると思っていますか?
EasyMockで 'static'メソッドや' private'メソッドをモックすることはできません。 静的初期化子の本体を移動することは、今のところできるリファクタリングのところまでです。 –
テスト対象のクラスに静的なinit/privateメソッドがある場合は、それを呼び出す必要があります。問題ない。しかし、クラスが嘲笑されている場合は、簡単なモックでは問題ありません。実装がないため呼び出されません。プライベートなものが存在しないかのように、パブリックインターフェイスを安全にモックすることができます。 –