下面是我要在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循环,但是测试仍在通过而不是失败。
答案 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。