2016-04-23 5 views
1

私は、プライベート静的最終変数を模倣して初期化するシングルトンに呼び出す次のクラスをテストしようとしています。thisの例に従ってください。mockitoとreflectionを使ってこのプライベート静的最終変数を欺くのはどうしたらいいですか?

は、ここで私は状況が列挙型である

public class ClassToTest { 

private static final boolean CONF_FLAG = Configuration.getConfig() 
.get(Status.Initialization).getConfFlag(); // throws an NPE 

public methodToTest(TestObject a){ 
... 
} 
} 

をやっているものです。

Testクラス:

public class TestClassToTest{ 

TestObject a; 
ClassToTest t; 
    @Before 
public void setUp() throws Exception { 
    setFinalStatic(ClassToTest.class.getDeclaredField("CONF_FLAG"), true);// this fails! 
    a = mock(TestObject.class); 
    t = new ClassToTest(); 
} 
static void setFinalStatic(Field field, Object newValue) throws Exception { 
    field.setAccessible(true);   
    Field modifiersField = Field.class.getDeclaredField("modifiers"); 
    modifiersField.setAccessible(true); 
    modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); 
    field.set(null, newValue); 
} 

}

私はCONF_FLAGの値を気にしませんが、カントはそれを嘲笑するように見えます。私は間違って何をしていますか? TestClassToTest

答えて

1

あなたのクラスがロードされると、この行は、私が使用PowerMockを提案したい問題を解決するために、そう

private static final boolean CONF_FLAG = Configuration.getConfig().get(Status.Initialization).getConfFlag(); 

と呼ばれています。

を使用してunnecessary behaviorを簡単にスキップできます。もちろん

Whitebox.setInternalState(ClassToTest.class, "CONF_FLAG", true) 

あなたが新しいライブラリを追加することができれば、それは場合に動作します:

また、あなたは簡単に内部状態を設定することができるようになります。

1

あなたのコードは正常に見えるが、ClassToTest.class.getDeclaredField("CONF_FLAG")にアクセスすると、NullPointerExceptionで結果を示しているのstatic final ClassToTest#CONF_FLAGフィールドを、初期化します。

ClassToTestでソースコードを変更できないとします。修正のために、呼び出しが成功するように、シングルトン(例えば、公開APIメソッドを使用して)を初期化するためにsetUp()でできることは何ですか?

もしそうなら、リフレクションを使用するのではなく、テストのためにConfigurationオブジェクトを準備するこのアプローチをとることができます。

+0

+1。ここで追加するには、呼び出しが静的フィールド初期化の一部として行われる限り、呼び出しのタイミングをほとんど制御できず、テストのために置き換える機会は事実上ありません。大まかに言えば、例外を投げたり、テストで疑惑を犯すような呼び出しが危険な場合は、スタティックイニシャライザを使用したくない場合があります。 –

+0

@Jeff Bowman、@ ck1ええ、私は完全に静的初期化子に置かない部分を理解していますが、これは私が打ち負かされたレガシーコードです。私はちょっと振る舞います。 'getConfig()'は静的メソッドです。シングルトンへの呼び出し全体をモック/スタブする方法はありますか?はいの場合、Idはいくつかのコード/擬似コードを非常に感謝しています。 – MuleNoob

関連する問題