這是我的代碼。我正在嘗試使用 JUnit 來測驗 deleteUsers() 方法,但是每次我撰寫測驗時,它都會洗掉我在資料庫中擁有的所有用戶。如何洗掉單個用戶?下面是方法和測驗的代碼。
@Override
public boolean deleteUsers(List<String> ids) throws Exception {
StringBuilder sql = new StringBuilder();
sql.append("delete from user where ");
for (String id : ids) {
sql.append(" id = ? or");
}
String strSql = sql.toString().substring(0, sql.length() - 2) ";";
PreparedStatement preparedStatement = this.connection.prepareStatement(strSql);
for (int i = 0; i < ids.size(); i ) {
preparedStatement.setInt(1 i, Integer.parseInt(ids.get(i)));
}
int lines = preparedStatement.executeUpdate();
preparedStatement.close();
return lines > 0;
}
uj5u.com熱心網友回復:
您缺少對空輸入的檢查。在您的測驗中,您將一個空串列傳遞給deleteUsers
該串列,從而生成以下 SQL 陳述句:
delete from user wher;
我希望 DBMS 會將此視為無效 SQL 拒絕,但也許有一些地方將其解釋為delete from user
簡單地洗掉所有用戶。
基本上你有2個選擇。通過傳遞一個空串列來洗掉所有用戶都是一個有效的用例——在這種情況下,您應該通過生成正確的 SQL 來正確處理它。ids
或者這不是預期的,如果為空,您應該調整代碼以引發例外。
@Override
public boolean deleteUsers(List<String> ids) throws Exception {
if (ids == null || ids.size() == 0) {
throw new IllegalArgumentException("List of IDs must not be empty");
}
...
}
false
當然,您也可以在輸入為空的情況下回傳以指示沒有用戶被洗掉。
要將值傳遞給deleteUsers
測驗中的方法,您需要將值添加到 used 串列中:
userDAOImpl.addUser("admin3", "111222");
final List<String> idsToDelete = new ArrayList<>();
idsToDelete.add("111222");
userDAOImpl.deleteUsers(idsToDelete);
uj5u.com熱心網友回復:
問題是由 SQL 的構建方式引起的。當 deleteUsers 傳遞一個空串列時,生成的 SQL 將是:
delete from user wher
這將導致所有資料被洗掉(表用戶被賦予別名“wher”)。我強烈建議在方法開始時檢查集合是否為空并且引發例外或回傳。
添加以下檢查
if (ids == null || ids.isEmpty()) {
throw new IllegalArgumentException("ids must not be empty");
}
uj5u.com熱心網友回復:
StringBuilder sql = new StringBuilder();
sql.append("delete from user where");
String orClause = "";
for (String id : ids) {
sql.append(orClause);
sql.append(" id = ?");
orClause = " or";
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/467563.html
標籤:爪哇 mysql 单元测试 junit4 junit5