如何测试检查值唯一性的java sql查询

时间:2016-10-12 09:00:10

标签: java mysql sql junit mockito

我有许多Java方法可以检查数据库中类似值的值唯一性。下面是一个例子:

public static boolean isNameUnique(String name){
    Statement stmt;

    try {
        stmt = dbConnection.createStatement();
        String sql = "SELECT name FROM model";
        ResultSet rs = stmt.executeQuery(sql);
        while(rs.next()){
            //Retrieve by column name
            String nameDatabase = rs.getString("name");
            if(name.trim().equals(nameDatabase.trim())){
              return false;
            }
        }

    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return true;
}

但是我不知道如何测试这个,该项目是在Tomcat 7上运行的WAR文件。我已经查看了JUnit测试,Mockito和Arquillian,但无法得到明确的答案我应该用。

我想要做的一个测试示例是将一个名称值插入数据库,然后检查相同的名称值,以确保为isNameUnique返回false。

我有许多类似于上面的方法,我需要检查数据库中的值与通过该方法传入的值。

所以基本上我正在寻找测试类似方法的最理想方法。

编辑:有人可以解释我的问题是如何与提到的问题重复吗?我没有看到任何相似之处。

EDIT2:对不起,如果不清楚,我正在寻找执行测试的最佳方法,我将名称值插入数据库,然后运行方法检查另一个名称值是否唯一。我需要测试数据库吗?我是否需要模拟对象或使用像arquillian这样的东西来测试名称的唯一性?

2 个答案:

答案 0 :(得分:0)

使用以下查询

String sql =“SELECT name FROM model where name!=?”;

在问号中,通过修剪该值来传递您获得的值。

答案 1 :(得分:0)

以下使用条件来过滤记录,并使用try-with-resources语法,以便关闭语句和结果集,但情况并非如此。

String sql = "SELECT name FROM model WHERE name = ?";
try (PreparedStatement stmt = dbConnection.prepareStatement(sql)) {
    stmt.setString(1, name.trim());
    try (ResultSet rs = stmt.executeQuery()) {
        if (rs.next()){
              return false;
        }
    }
} catch (SQLException e) {
    throw new IllegalStateException(sql, e);
}
return true;

PreparedStatement会转义'之类的特殊字符并阻止SQL注入。