即使 sql 查询不应该返回任何记录,JUnit 测试仍然通过

Posted

技术标签:

【中文标题】即使 sql 查询不应该返回任何记录,JUnit 测试仍然通过【英文标题】:JUnit test is still passing even though sql query should return no records 【发布时间】:2018-10-17 11:23:10 【问题描述】:

我正在编写查询 SQL Server 数据库的黄瓜测试。

下面的查询应该失败,因为表中不存在记录。但是,测试通过了。

try  
        Class.forName(JDBC_DRIVER); 
        System.out.println("Connecting to database..."); 
        conn = DriverManager.getConnection(DB_URL,USER,PASS);  

        System.out.println("Connected database successfully..."); 
        stmt = conn.createStatement(); 
        String sql = "SELECT id FROM tclientlink WHERE id = '0000060115123'"; 
        ResultSet rs = stmt.executeQuery(sql);

        while(rs.next())  
            int id  = rs.getInt("goald_client_id"); 
            System.out.print("ID IS HERE: " + id); 
            assertEquals(60115, id);
         
        rs.close(); 
     catch(SQLException se)  
        se.printStackTrace(); 
     catch(Exception e)  
        e.printStackTrace(); 
     finally  
        try  
            if(stmt!=null) stmt.close();  
         catch(SQLException se2)  
        
        try  
            if(conn!=null) conn.close(); 
         catch(SQLException se)  
            se.printStackTrace(); 
        
    
    System.out.println("Goodbye!"); 
 

【问题讨论】:

您的查询结果如何? @YitianZhang 嗨,我已经添加了上面应该失败的代码。所以这个方法应该在上面失败。您可以看到我添加的 sys.out,但以下详细信息是唯一记录到控制台的详细信息:正在连接数据库...已成功连接数据库...再见! 如果表中不存在记录,则结果集将为空,这意味着永远不会执行assertEquals(60115, id); @ThomasKläger 嗨,好的,谢谢。如果结果集为空,我需要对代码进行哪些更改以使其失败? 如果没有发现它应该失败,那么你可以用一个简单的检查替换你的while (rs.next()) ... 循环:if (!rs.next()) fail("No data found"); 【参考方案1】:

您在以下行中有NullPointerException

int id  = rs.getInt("goald_client_id"); 

它进入异常块,只需在所有异常块中添加以下语句

assertEquals(true, false);

【讨论】:

我已将它添加到所有的 catch 语句中,但测试仍然通过【参考方案2】:

您的 while 循环未执行,因为结果集中没有记录,默认情况下测试用例通过, 请进行以下更改

while(rs.next())  
    int id  = rs.getInt("goald_client_id"); 
    System.out.print("ID IS HERE: " + id); 
    assertEquals(60115, id);
 

改变上面的代码
int noOfRecords = 0;

while(rs.next())  
    int id  = rs.getInt("goald_client_id"); 
    System.out.print("ID IS HERE: " + id); 
    assertEquals(60115, id);
    noOfRecords ++;
 

if( noOfRecords == 0 ) 
    assertEquals(true, false);

【讨论】:

以上是关于即使 sql 查询不应该返回任何记录,JUnit 测试仍然通过的主要内容,如果未能解决你的问题,请参考以下文章

Spring JPA Repository findAll 在 JUnit 测试中不返回任何数据

sql查询双精度-null> 0不返回任何记录

即使 sql developer 中不存在数据,也返回给定员工的行

Query.getResultList() 即使sql表有行也不返回结果

SQL 查询在它应该返回的时候没有返回任何结果

休眠选择查询不返回任何内容