我試圖測試下面的類,它調用一個單例,通過嘲笑它來初始化一個私有靜態最終變量,遵循this示例。我在做什麼錯用mockito和反射嘲笑這個私有靜態最終變量?
下面是我在做什麼
public class ClassToTest {
private static final boolean CONF_FLAG = Configuration.getConfig()
.get(Status.Initialization).getConfFlag(); // throws an NPE
public methodToTest(TestObject a){
...
}
}
,其中狀態是一個枚舉。
測試類:
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
價值,但不能似乎嘲笑它。我究竟做錯了什麼?
+1。要在此添加,只要該呼叫作爲靜態字段初始化的一部分發生,您將幾乎不能控制呼叫的時間,並且實際上沒有機會將其替換爲測試。作爲一個經驗法則,如果一個調用足夠危險,可能拋出一個異常或在測試中保證嘲笑,你不希望它在任何靜態初始化器中。 –
@Jeff Bowman,@ ck1是的,我完全理解關於不將它放置在靜態初始化器中的部分,但這是一個遺留代碼,我被打了一巴掌,我有點不習慣在我的周圍工作。 'getConfig()'是一個靜態方法..有什麼辦法可以模擬/存根整個調用單身?如果是的話,Id非常感謝一些代碼/僞代碼。 – MuleNoob