如何检查Java JDBC代码是否使用正确的列名?

时间:2016-02-08 17:41:37

标签: java postgresql jdbc

我有一套端到端测试测试套件。它们应该在SQL语句,错误的表或列名称(DB模式和Java代码不同意的任何内容)或缺少数据库权限时捕获拼写错误。我不想依赖数据库中的数据(设置太复杂);这只是一个基本的测试。

import java.sql.*;
import org.junit.Test;

public class TypoTest {
    private Connection getConnection() throws Exception {
        String connectionString = "jdbc:postgresql://127.0.0.1:5432/db";
        String driverClassName = "org.postgresql.ds.PGConnectionPoolDataSource";
        Class.forName(driverClassName).newInstance();
        return DriverManager.getConnection(connectionString, "robert", "");
    }

    @Test
    public void runQuery() throws Exception {
        try (Connection connection = getConnection();
             PreparedStatement ps = connection.prepareStatement("SELECT relname FROM pg_catalog.pg_class");
             ResultSet data = ps.executeQuery()) {
            while (data.next()) {
                data.getString("relname");
            }
        }
    }
}

当我运行上述测试时,如果SELECT语句中有拼写错误,则会失败。 (好。)如果data.getString("typo here")中的列名中有拼写错误,如果查询的表没有数据,则不会被捕获,因为从未输入循环。为了简化测试(设置),我不想先将数据插入到我的表中。

我想我可以将列名称设置为常量并将DRY设置为代码并解决问题。

但是,我想知道是否有更简单的方法...我很懒,不想编辑我的所有查询。有没有更好的方法来对我的SQL进行单元测试?

我正在使用Postgres 9.5和JDBC 4。

1 个答案:

答案 0 :(得分:1)

我猜你已经have the answer you seek但是为了回答,你可以尝试使用select * from table $myValues = array('Austin Metro','Central Austin','Georgetown'); $myIds = array('3','4','5'); if (isset($_POST['checkbox_list']) && array_search($_POST['checkbox_list'], $myValues) !== false) { $index = array_search($_POST['checkbox_list'], $myValues); $indeed_mail->indeed_wysija_subscribe( $myIds[$index], $email ); } ,然后根据你的查询检查列名(你&#39} ; d我必须解析查询字符串...)。

我相信它也适用于空表,但请注意我没有测试过空表的情况。