2012-12-04 59 views
0

我無法獲得此JUnit測試通過爲我的生活。有人可以指出哪裏出了問題。我正在進行數據遷移(MSSQL SERVER 2005),但我將sourceDBUrl和targetDCUrl設置爲相同的URL,以便將其縮小爲語法錯誤。所以這就是我所知道的一個語法錯誤。我正在比較查詢的結果JAVA-SQL-數據遷移 - ResultSets比較失敗的JUnit測試

SELECT programmeapproval, resourceapproval FROM tr_timesheet WHERE timesheetid = ? 

並且測試總是失敗,但是通過了我開發的其他junit測試。我創建了3個diffemt resultSetsEqual方法,但都沒有工作。但是,我開發的一些其他JUnit測試已通過。查詢:

SELECT timesheetid,programmeapproval,resourceapproval FROM tr_timesheet

返回三列

  • timesheetid(PK,INT,不爲空)(填充了的範圍內的 號碼2240-2282)
  • programmeapproval(smalli NT,NOT NULL)(在各個領域與 1號填充)
  • resourceapproval(SMALLINT,不爲空)(在各個領域與多家 1填充)

當我運行查詢它嵌入在代碼中,它只返回具有programmeapproval和resourceapproval列的一行,並且兩個字段都填充了數字1.

我已經正確安裝並測試了所有jdbc驅動程序的連接性。根據IDE,此時JUnit測試失敗。

assertTrue(helper.resultSetsEqual2(sourceVal,targetVal)); 

這是代碼:

/* 這是一個有JUnit類 ****

package a7.unittests.dao; 

import static org.junit.Assert.assertTrue; 
import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.Types; 
import org.junit.Test; 
import artemispm.tritonalerts.TimesheetAlert; 


public class UnitTestTimesheetAlert { 

@Test 
public void testQUERY_CHECKALERT() throws Exception{ 


UnitTestHelper helper = new UnitTestHelper(); 
Connection con = helper.getConnection(helper.sourceDBUrl); 
Connection conTarget = helper.getConnection(helper.targetDBUrl); 

PreparedStatement stmt = con.prepareStatement("select programmeapproval, resourceapproval from tr_timesheet where timesheetid = ?"); 
stmt.setInt(1, 2240); 
ResultSet sourceVal = stmt.executeQuery(); 

stmt = conTarget.prepareStatement("select programmeapproval, resourceapproval from tr_timesheet where timesheetid = ?"); 
stmt.setInt(1,2240); 
ResultSet targetVal = stmt.executeQuery(); 
assertTrue(helper.resultSetsEqual2(sourceVal,targetVal)); 
}} 

/*END* */

/* 這是一個常規CLASS **/

package a7.unittests.dao; 

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.ResultSetMetaData; 
import java.sql.SQLException; 

public class UnitTestHelper { 





static String sourceDBUrl = "jdbc:sqlserver://127.0.0.1:1433;databaseName=a7itm;user=a7user;password=a7user"; 
static String targetDBUrl = "jdbc:sqlserver://127.0.0.1:1433;databaseName=a7itm;user=a7user;password=a7user"; 




public Connection getConnection(String url)throws Exception{ 
    return DriverManager.getConnection(url); 
} 
public boolean resultSetsEqual3 (ResultSet rs1, ResultSet rs2) throws SQLException { 
    int col = 1; 
    //ResultSetMetaData metadata = rs1.getMetaData(); 
    //int count = metadata.getColumnCount(); 
    while (rs1.next() && rs2.next()) { 
     final Object res1 = rs1.getObject(col); 
     final Object res2 = rs2.getObject(col); 
     // Check values 
     if (!res1.equals(res2)) { 
      throw new RuntimeException(String.format("%s and %s aren't equal at common position %d", 
       res1, res2, col)); 
     } 

     // rs1 and rs2 must reach last row in the same iteration 
     if ((rs1.isLast() != rs2.isLast())) { 
      throw new RuntimeException("The two ResultSets contains different number of columns!"); 
     } 


    } 
    return true; 
} 
public boolean resultSetsEqual (ResultSet source, ResultSet target) throws SQLException{ 
    while(source.next()) 
    { 
     target.next(); 
     ResultSetMetaData metadata = source.getMetaData(); 
     int count = metadata.getColumnCount(); 
     for (int i =1; i<=count; i++) 
     { 
      if(source.getObject(i) != target.getObject(i)) 
      { 

       return false; 

      } 

     } 

    } 

    return true; 
} 

public boolean resultSetsEqual2 (ResultSet source, ResultSet target) throws SQLException{ 
    while(source.next()) 
    { 
     target.next(); 
     ResultSetMetaData metadata = source.getMetaData(); 
     int count = metadata.getColumnCount(); 
     for (int i =1; i<=count; i++) 
     { 
      if(source.getObject(i).equals(target.getObject(i))) 
      { 

       return false; 

      } 

     } 

    } 

    return true; 
} 
} 

/END ** */

/* 粘貼類新 - 這是一個JUNIT測試類 */

package a7.unittests.dao; 

import static org.junit.Assert.*; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import org.junit.Test; 


public class TestDatabaseConnection { 

@Test 

public void testConnection() throws Exception{ 

    UnitTestHelper helper = new UnitTestHelper(); 
    Connection con = helper.getConnection(helper.sourceDBUrl); 
    Connection conTarget = helper.getConnection(helper.targetDBUrl); 
    assertTrue(con != null && conTarget != null); 

} 

}

/* * END ***/

+0

失敗,斷言錯誤? – bellum

+0

今後,請僅包含與您手邊的問題相關的代碼 - 您粘貼得太多。其他說明:在Java中,您可以與'=='或'!='進行比較的唯一方法是整型(包括char),布爾值和引用。從JUnit 4.0開始(你似乎正在使用),測試類和「常規」類沒有區別;因此,不需要在測試/驗證代碼中引發異常(反正這會造成誤導)。總是嘗試根據你實際驗證的內容('assertNotNull()')來使用最合適的'assert *'。 –

回答

3

當對象是equal時,您返回了false。在這種方法中,我將條件更改爲not equals

public boolean resultSetsEqual2 (ResultSet source, ResultSet target) throws SQLException{ 
    while(source.next()) 
    { 
     target.next(); 
     ResultSetMetaData metadata = source.getMetaData(); 
     int count = metadata.getColumnCount(); 
     for (int i =1; i<=count; i++) 
     { 
      if(!source.getObject(i).equals(target.getObject(i))) //added ! 
      { 
        return false; 
      } 
     } 
    } 
    return true; 
} 
+0

是的,這應該是他問題的根源。你還可以提供一些關於他的代碼_rest_狀態的其他建議(即使只用這種方法)?不要試圖回答手頭的問題,也應該尋求啓發你的開發者。 (順便說一句,好點,+1)。 –

+0

這就是這樣一個小小的錯誤和這麼多時間,非常感謝。我只需要一點同行評議。 – Croeber

+0

@ user1865053沒問題。其他代碼不錯。但不要在'resultSetsEqual'中使用'!='運算符來進行對象比較。祝你好運。 – bellum