2016-10-12 81 views
1

我有許多Java方法檢查數據庫中相似值的值唯一性。這裏有一個例子:如何測試檢查值唯一性的java sql查詢

public static boolean isNameUnique(String name){ 
    Statement stmt; 

    try { 
     stmt = dbConnection.createStatement(); 
     String sql = "SELECT name FROM model"; 
     ResultSet rs = stmt.executeQuery(sql); 
     while(rs.next()){ 
      //Retrieve by column name 
      String nameDatabase = rs.getString("name"); 
      if(name.trim().equals(nameDatabase.trim())){ 
       return false; 
      } 
     } 

    } catch (SQLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return true; 
} 

但是我不知道如何測試這一點,該項目是在Tomcat 7運行的WAR文件,我擡頭談論的JUnit測試,並的Mockito但的Arquillian不能得到明確答案,我應該使用。

我想要做的測試的一個例子是向數據庫中插入名稱值,然後檢查相同的名稱值以確保isNameUnique返回false。

我有一些類似於上面的方法,其中我需要檢查數據庫中的值與通過該方法傳入的值的方法。

所以基本上我正在尋找最理想的方式來測試類似這樣的方法。

編輯:有人可以解釋我的問題是如何提到的一個副本?我沒有看到任何相似之處。編輯2:對不起,如果它不清楚,我正在尋找執行測試的最佳方式,我將名稱值插入到數據庫中,然後運行一個方法來檢查另一個名稱值是否唯一或不是。我需要測試數據庫嗎?我是否需要模擬對象或使用類似arquillian的東西來測試名稱的唯一性?

+0

*有人可以解釋我的問題是如何重複的...... *,當然,你說*我想要做的是插入一個名字*,並且你想要唯一性,並且該目標可以返回一個計數。這個解釋夠了嗎?問題改進是否可以做到最好?也許你應該做的是表明一個清晰的模式,在回答問題之前,有答案的人應該要求。 – Drew

+0

也許我沒有澄清我的問題,我正在尋找最好的框架來執行測試,將一個名稱值插入到數據庫中,然後運行一個測試來檢查是否將重複的名稱值傳入了方法該方法將返回false。我可以很容易地使用junit來返回false部分,但真正的問題是如何複製具有插入名稱值的數據庫用於測試目的。 – olliejjc16

+0

所以你要求一個測試框架的離題資源請求。 – Drew

回答

0

使用下面的查詢

字符串SQL = 「選擇的名字從模型,其中名稱=!?」;

在問號中,通過修剪該值來傳遞您所得到的值。

+0

您好查詢的工作原理,我只是尋找在查詢 – olliejjc16

0

以下使用條件來過濾記錄和try-with-resources語法,以便關閉語句和結果集,但情況並非如此。

String sql = "SELECT name FROM model WHERE name = ?"; 
try (PreparedStatement stmt = dbConnection.prepareStatement(sql)) { 
    stmt.setString(1, name.trim()); 
    try (ResultSet rs = stmt.executeQuery()) { 
     if (rs.next()){ 
       return false; 
     } 
    } 
} catch (SQLException e) { 
    throw new IllegalStateException(sql, e); 
} 
return true; 

PreparedStatement轉義特殊字符如'並防止SQL注入。

+0

上運行測試的最佳方式嗨,謝謝你,我會更新我的代碼來匹配這個,但它不回答我的問題,我將如何去實際去關於測試這種類型的方法 – olliejjc16

+0

其餘的實際問題是(1)做一個參考實現 - 可怕但完整的覆蓋,(2)製作虛擬數據 - 冒着測試代碼覆蓋的內容的風險。恕我直言,測試框架可能只會簡化一些東西,但不會帶走工作, –