2013-03-27 153 views
2

我想在Spring項目中測試一個類。我想在測試類和dao類中儘可能多地進行更改,以便我不必因爲更改而重新測試各種事物。用Mockito嘲笑JdbcTemplate的DataSource

我正在使用這個類有一個JdbcTemplate template類變量,它由以下實例:

setJdbcTemplate(DataSource dataSource) { 
    this.template = new JdbcTemplate(dataSource); 
} 

我想測試的方法使得一個template.query(<code>)運行定義的SQL查詢並返回結果到一個列表。

我在我的測試用例中創建了以下內容,但我不確定如何投入使用。我可以讓下面的代碼返回一個使用Mockito的字符串列表嗎?

DataSource mockedDataSrc = Mockito.mock(DataSource.class); 
customerClassDao.setJdbcTemplate(mockedDataSrc); 

我可以以某種方式使用when或其他命令來設置我要返回到的JdbcTemplate的.query叫什麼?

回答

1

您不能這樣做,因爲您無法控制JdbcTemplate實施。您應該依賴注入JdbcTemplate,然後模擬JdbcTemplate

這個問題指出你的代碼有問題。您的代碼取決於JdbcTemplate的具體實例。如果你使用依賴注入來代替它,那麼耦合將會減少。


既然你不想修改下測試你的系統,你可以這樣做:

更改template領域,所以它包保護(即:去掉私有關鍵字)。然後,在實例化正在測試的類之後,我將它設置爲模擬(JdbcTemplate.class)。現在您可以直接使用JdbcTemplate,並且可以像最初一樣直接驗證。

所以你在測試看起來像這樣的類:

public class SystemUnderTest { 

JdbcTemplate jdbcTemplate; 

    public void setJdbcTemplate(DataSource dataSource) { 
     this.template = new JdbcTemplate(dataSource); 
    } 

} 

和你的測試將做到這一點:

@Before 
public void setUp() { 
    SystemUnderTest sut = new SystemUnderTest(); 
    sut.jdbcTemplate = mock(JdbcTemplate.class);     
} 

// ... 
+0

數據源通過applicationContext.xml通過Spring注入。我不知道他們爲什麼選擇只注入數據源而不是jdbcTemplate,但我試圖能夠測試我編寫的方法,而不必更改/重構太多的代碼。因爲我的更改實際上隻影響1個方法中的1個SQL調用。 – Kyle 2013-03-27 20:11:01

+0

如果你現在模擬dataSource並傳遞它,你的測試崩潰了嗎?如果沒有,你可以做一些事情,但我需要首先知道。 – 2013-03-27 20:14:48

+0

它不會崩潰,它只是說成功。我只是沒有從這裏出發,我對Mockito/jUnit很陌生。我一直在Google上搜索幾個小時,除了我上面顯示的兩行外,還沒有想出去哪裏。 – Kyle 2013-03-27 20:18:45

2

如果你正在測試一個DAO這沒有任何意義可言嘲笑數據源。你在測試什麼?您需要製作一個與數據庫交互的DAO。

一旦你有了這個工作,你可以在測試使用它的服務時自由地模擬基於接口的DAO。您已經測試了DAO;在測試服務時沒有理由重做它。

如果你在測試DAO時嘲笑數據源,我會說你偏離了軌道。

+0

對DAO中的RowMapper或其他代碼進行測試可能很有用,它可以使用結果集並構建除香草查詢響應之外的其他代碼。 – DomenicDatti 2016-08-08 14:16:28

+0

如果DAO工作,您可以模擬ResultSet或在DAO測試中包含RowMapper。 – duffymo 2016-08-08 14:18:18