簡體   English   中英

DAO層上的Junit測試為Postgresql exist()查詢返回錯誤結果

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM