下面是我尝试在 junit 测试中使用的子查询。
下面的代码通过了,而测试应该失败。
我使用的值(this.Id)在tlink中不存在,因此子查询不应返回任何记录。 (即 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 循环,但测试仍然通过而不是失败。
最佳答案
The value I am using (this.Id) does not exist in the tlink, so the sub-query should return no record. (I.e. no record exists in tlink for that extId)
您使用的查询是:
SELECT count(*) as total
FROM taddress
WHERE address_id = (SELECT address_id FROM tlink WHERE ext_id =" + this.ID + ")")
(注意:强烈建议使用参数,而不是修改查询字符串。)
此查询总是返回一行(除非出现错误,您应该检查该错误,特别是对于审核测试)。如果没有任何内容与 where
子句匹配,则 total
将为 0
。
这解释了为什么 fail()
没有被调用——这与你在问题中的陈述相矛盾。
为什么 assert()
没有失败?好吧,您已经检查了第一条记录,所以我认为它正在转移到第二条记录。因此,while
循环没有被调用。您应该只查找一次返回值并检查它是否为 0。
关于java - SQL子查询没有返回任何值,但junit测试仍然通过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52906350/