2017-04-13 111 views
1

我已經看過類似於這個的其他問題,但他們沒有這個確切的用例。如何模擬靜態方法設置的最終靜態變量?

如果我有類似下面的代碼:

private static final String SOME_CONSANT = SomeStaticClass.getString(); 

我怎麼會去嘲笑他,以便它並不總是返回一個空指針異常?我曾嘗試使用Whitebox.setInternalState,但似乎只有在值不是由靜態方法設置時才起作用。我也嘗試了概述here反思沒有成功。

我想這是因爲靜態方法沒有被模擬,所以返回的值總是爲空,但使用以下似乎也不工作。

PowerMockito.mockStatic(SomeStaticClass.class); 
when(SomeStaticClass.getString(Mockito.anyString())).thenReturn("test"); 
Whitebox.setInternalState(ClassUnderTest.class, "SOME_CONSANT", "value"); 

我不知所措。感謝任何幫助。

+1

重構你的代碼會好得多,所以你不需要爲了測試它而去破解它。 –

+0

不幸的是我不能改變太多靜態方法是遺留的,我需要使用它 – Toofy

+0

在這種情況下,你需要測試它嗎?如果你從你的代碼中使用它,我會試着嘲笑那個級別。 * –

回答

0

我認爲你的主要問題是你試圖嘲笑不同的方法。

使用此代碼when(SomeStaticClass.getString(Mockito.anyString())).thenReturn("test");您模擬方法SomeStaticClass.getString(String parameter),但是,在您的原始代碼中您有SomeStaticClass.getString()