[英]Junit test on DAO layer returns wrong results for postgresql exists() query
我正在使用junit spring和jdbcTemplate测试我的DAO层。 例如,我有一个Address类和一个AddressDAO,我实现了一个方法exist(long id),如果给定的Address id在数据库中退出,则该方法返回true,否则返回false:
private static final String EXISTS_SQL = "SELECT EXISTS(SELECT * FROM \"ADDRESS\" WHERE id_address = ?)";
public boolean exists(long id){
return this.jdbcTemplate.query(AddressDAOImpl.EXISTS_SQL,
new Object[]{id},
new ResultSetExtractor<Boolean>() {
@Override
public Boolean extractData(ResultSet resultSet) throws SQLException,DataAccessException {
boolean result = resultSet.next();
return result;
}
});
}
但是,当我执行以下junit测试时,它会失败:
@Test
@Transactional
@Rollback(true)
public void testExists(){
Candidate c = new Candidate();
c.setEmail("email74");
c.setPassword("password");
candidateDAO.insert(c);
Address a1 = new Address();
a1.setRegistredUser(c);
addressDAO.insert(a1, c.getId());
boolean exists = addressDAO.exists(a1.getId());
Address a2 = new Address();
a2.setRegistredUser(c);
addressDAO.insert(a2, c.getId());
addressDAO.delete(a2);
boolean dontExists = addressDAO.exists(a2.getId());
System.out.println("exists = " + exists);
System.out.println("dontExists = " + dontExists);
Assert.assertTrue(exists == true);
Assert.assertTrue(dontExists == false);
}
如果我插入地址并删除地址,则exist方法返回true
exists = true
dontExists = true
我不明白为什么...是因为它在事务内执行并且地址可能在其末尾删除了?
感谢您的帮助。
这是因为您在SQL中使用了SELECT EXISTS([...])。 该语句始终返回包含true或false(0或1)的单行,因此resultSet.next()总是找到一行,并且由于此函数在找到一行后返回true,因此您总是会得到true。
如果要以这种方式进行检查,建议您只删除外部的select(SELECT EXISTS),而只保留内部的。 这样,如果找不到行,则.next()将返回false。 您也不应选择所有列(使用*),而应选择单个列(最好是带有索引的列,例如仅是主键)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.