[英]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.