如何检查Java JDBC代码是否使用了正确的列名?
我有一套端到端测试。它们应该能够捕获SQL语句中的拼写错误、错误的表名或列名(DB模式和Java代码不一致的任何内容)或缺少DB权限。我不想依赖数据库中的数据(设置起来太复杂);这只是一个基本的测试如何检查Java JDBC代码是否使用了正确的列名?,java,postgresql,jdbc,Java,Postgresql,Jdbc,我有一套端到端测试。它们应该能够捕获SQL语句中的拼写错误、错误的表名或列名(DB模式和Java代码不一致的任何内容)或缺少DB权限。我不想依赖数据库中的数据(设置起来太复杂);这只是一个基本的测试 import java.sql.*; import org.junit.Test; public class TypoTest { private Connection getConnection() throws Exception { String connection
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(“此处输入错误”)
中的列名中有输入错误,那么如果查询的表没有数据,则不会捕获该错误,因为这样就不会进入循环。为了保持测试(设置)简单,我不想先将数据插入表中
我想我可以把列名变成常量,修改代码,解决这个问题
然而,我想知道是否有更简单的方法。。。我很懒,不想编辑所有的查询。有没有更好的方法对我的SQL进行单元测试
我正在使用Postgres 9.5和JDBC 4。我猜您已经在使用了,但为了回答问题,您可以尝试使用select*from table
,然后根据查询检查列名(我猜您必须解析查询字符串…)
我相信它也适用于空表,但请注意,我还没有测试空表场景。
从一些表中选择a、b、c如果没有名为a
的列,即使表中没有行,code>也将失败。对列名的检查发生在检索数据之前很久。你的测试中一定有不同的缺陷。请给我们看完整的测试代码谢谢你救了我的命。我应该更好地检查代码。您是对的,选择将失败。我在sqlselect和将列数据转换为Java对象的代码中都有列名。我只升级了SQL SELECT,但没有升级转换代码。这就是为什么没有数据它不会失败。同样,我的错误是没有双重检查SELECT。是的,这会起作用,但实际上为列设置常量可能更容易。是的。你可以考虑Enums。