2014-07-16 96 views
2

我重新考慮了一個類,我正在嘗試更新單元測試以反映這一點。其中除了類,如下所示靜態字段:使用JMockit嘲笑靜態類字段

private static JdbcTempate jdbcTemple = DbConfiguration.getJdbcTemplate(); 

當加入這個領域我得到空指針錯誤後運行單元測試。我通過用createMock()WhiteBox.setInternalState()方法使用powermock嘲笑字段解決了這個問題,這很簡單。

然而,其中一套測試使用JMockit代替powermock和mockito。任何人都可以告訴我如何使用JMockit來嘲笑這個領域?

回答

3

試驗可以容易地與JMockit寫成:

@Test 
public void setStaticField(@Mocked JdbcTemplate mockTemplate) 
{ 
    Deencapsulation.setField(ClassUnderTest.class, mockTemplate); 

    assertSame(mockTemplate, ClassUnderTest.getJdbcTemplate()); 
} 

mockit.Deencapsulation類相當於WhiteBox,包括在設置靜態最終字段的能力。

+0

非常感謝:) – Mat

1

不知道這是否是你想要的,但你可以嘲笑DbConfiguration和訓練它的方法getJdbcTemplate返回所需的值:

在你的TestClass添加:

@Mocked 
private DbConfiguration dbConfiguration; 

在你TestMethod的添加:

new NonStrictExpectations() {{ 
    DbConfiguration.getJdbcTemplate(); 
    result = new JdbcTemplate("mock"); // or return what ever you want your private field to contain... 
}}; 

當實例您ClassUnderTest擁有這個私人靜態字段,不是有由定義的值字段「結果= ...」。

+1

這是正確的,但只有在執行測試時,包含靜態字段的類尚未由JVM初始化時纔有效。如果是這樣,那麼'DbConfiguration.getJdbcTemplate()'在測試過程中不會被調用,並且期望不起作用。 –