2016-01-08 34 views
0

如何模擬DriverManager.getConnection()方法?如何模擬DriverManager.getConnection?

我想測試我的方法setUpConnectiontoDB()

我PowerMock,EasyMock的和Mokito自己試了一下。我沒有發現任何有用的東西。

我的代碼:

import java.io.FileInputStream; 
import java.io.IOException; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 
import java.util.Properties; 

public class MysqlDAO implements DAO { 
    private final Properties properties = new Properties(); 

    public MysqlDAO(String configPath) { 
     loadProperties(configPath); 
    } 

    private Properties loadProperties(String configPath) { 
     try { 
      properties.load(new FileInputStream(configPath)); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return this.properties; 
    } 

    @Override 
    public Connection setUpConnectionToDB() { 
     try { 
      Class.forName("com.mysql.jdbc.Driver"); 

      return DriverManager.getConnection(
        properties.getProperty("url"), 
        properties.getProperty("user"), 
        properties.getProperty("passwd")); 

     } catch (ClassNotFoundException | SQLException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
} 
+0

您沒有提供試用版嗎?你是什​​麼意思**我沒有發現任何有用的**?從這三個框架中選出一個,讓我們知道你面臨的挑戰是什麼?順便說一下,我不是下來的選民:)它是一個有效的問題,你提供你正確地描述它與所有需要的信息。 –

+0

目前我正在做一個學徒,我正在學TTD。我想測試setUpConnectionToDB()方法,所以它正確地建立了一個工作連接。是的,我可以通過連接我的本地MYSQL來測試它,但這不是重點。因爲當我建立我的項目並部署它。 MYSQL將不會被測試。所以我試圖嘲笑這種方法。不是即將發表的聲明,我必須準備。或者不讓這個任何派別? – DK1990

+0

mock返回一個假對象,所以如果你模擬'DriverManager.getConnection()',你的'Connection'對象將是一個假對象,並且你將不能在該''Connection'對象上執行任何**真實**任務。在** Jan **建議的內存數據庫中,如果您想要執行DB數據驗證,那麼該方法就行了。 –

回答

4

上的一些注意事項:

Class.forName("com.mysql.jdbc.Driver"); 

這條線是過時的,因爲JDBC 4.0。你應該可以不用運行代碼。或者,如果你認爲你需要它至少摘要以及做

Class.forName(properties.getProperty("dbdriver", "com.mysql.jdbc.Driver"); 

一旦這就是被照顧,誰說你必須嘲笑它​​?實際運行它更容易。

你可以使用內存數據庫(如h2)來測試和檢查你的代碼。所有你會改變將是你的網址,用戶和passwd屬性。

這將是使用一些例如性能與h2

dbdriver = org.h2.Driver 
url = jdbc:h2:mem:test 
user = sa 
passwd = sa 

這樣,你不僅照顧您的單元測試的爲setUpConnectionToDB(),但以後可以使用這方面的方法來說期望該數據庫中的一些數據。

+0

+1使用真正的內存數據庫,因爲它比嘲笑它更容易。作爲除了h2之外的另一個選項,您可以嘗試使用Derby Embedded,它非常易於設置,並且還具有in-mem數據庫。 https://db.apache.org/derby/derby_downloads.html –