2012-12-04 57 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