SQL子查询不返回任何值,但junit测试仍在通过

时间:2018-10-20 13:46:10

标签: java sql sql-server junit junit4

下面是我要在junit测试中使用的子查询。

当测试应该失败时,下面的代码正在通过。

我正在使用的 (this.Id) 值在链接中不存在,因此子查询不应返回任何记录。 (即tlink中没有该extId的记录)

但是,测试仍然通过。

try {
        dbAccessSetUp();
        ResultSet rs = stmt.executeQuery("SELECT count(*) as total FROM taddress WHERE address_id = (SELECT address_id FROM tlink WHERE ext_id =" + this.ID + ")");

        if(!rs.next()) {
            fail("Record does not exist in taddress");
        }
        int count = 0;
        while(rs.next()) {              
            count = rs.getInt(1);
            System.out.println("number of count : " + count);
            assertTrue(0 < count);
        } 
        rs.close(); 
    } catch(SQLException se) { 
        se.printStackTrace(); 
        assertEquals(true, false);
    } catch(Exception e) { 
        e.printStackTrace();
        assertEquals(true, false);
    } finally { 
        try { 
            if(stmt!=null) stmt.close();  
        } catch(SQLException se2) {
            assertEquals(true, false);
        } 
        try { 
            if(conn!=null) conn.close(); 
        } catch(SQLException se) {
            se.printStackTrace(); 
            assertEquals(true, false);
        } 
    } 

有人知道为什么这种方法不起作用吗? 另外,由于未显示System.out,因此实际上并没有进入while循环,但是测试仍在通过而不是失败。

1 个答案:

答案 0 :(得分:1)

  

我正在使用的值(this.Id)在链接中不存在,因此子查询应该不返回任何记录。 (即tlink中没有该extId的记录)

您使用的查询是:

GET

(注意:强烈建议使用参数,而不要浪费查询字符串。)

此查询总是 返回精确的一行(除非有错误,您应该检查该错误,尤其是对于审计测试)。如果没有任何匹配SELECT count(*) as total FROM taddress WHERE address_id = (SELECT address_id FROM tlink WHERE ext_id =" + this.ID + ")") 子句,则where将是total

这解释了为什么未调用0的情况-与您在问题中的陈述相矛盾。

fail()为什么不失败?好了,您已经检查了第一条记录,因此我认为它正在转移到第二条记录。因此,assert()循环没有被调用。您应该只查询一次返回的值,然后检查它是否为0。