Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 测试jdbc查询和准备好的语句_Java_Unit Testing_Jdbc - Fatal编程技术网

Java 测试jdbc查询和准备好的语句

Java 测试jdbc查询和准备好的语句,java,unit-testing,jdbc,Java,Unit Testing,Jdbc,我有一个类,在这个类中,我使用旧的jdbc方法(编写url并获取连接)创建了到h2数据库的连接,我正在数据库中创建一个表,因为这个表不是java对象,所以我没有聪明的方法来为我的方法编写测试 这是其中一种方法 //above would be the url and driver connection //我还创建了一个表app\u用户 public void addUser(连接, 字符串登录,字符串密码, 字符串描述)引发SQLException{ System.out.p

我有一个类,在这个类中,我使用旧的jdbc方法(编写url并获取连接)创建了到h2数据库的连接,我正在数据库中创建一个表,因为这个表不是java对象,所以我没有聪明的方法来为我的方法编写测试 这是其中一种方法

//above would be the url and driver connection
//我还创建了一个表app\u用户 public void addUser(连接, 字符串登录,字符串密码, 字符串描述)引发SQLException{

        System.out.println(String.format("Add user : %s", login));

        String newUSer = "INSERT INTO app_user(login, password, description) VALUES (?,?,?)";

        try (PreparedStatement preparedStatement = connection.prepareStatement(newUSer)) {

            preparedStatement.setString(1, login);
            preparedStatement.setString(2, password);
            preparedStatement.setString(3, description);

            // returns number of changed column
            preparedStatement.executeUpdate();
        }
    }
我的测试方法是这样的,有没有办法让它变得不那么整洁和简单,我试着用mockito来模拟,但是我的app_用户表不是类app_用户的对象,所以我写了这个

@Test
    public void addUser() throws SQLException, ClassNotFoundException {


        Class.forName("org.h2.Driver");
        try (Connection connection = DriverManager.getConnection(URL, "sa", "")) {

            String createTable =
                    "CREATE TABLE app_user(" +
                            "user_id INT NOT NULL AUTO_INCREMENT," +
                            "login VARCHAR (255) NOT NULL ," +
                            "password VARCHAR (255) NOT NULL ," +
                            "description VARCHAR (255) NULL," +
                            "PRIMARY KEY (user_id))";

            try (Statement statement = connection.createStatement()) {
                statement.executeUpdate(createTable);
                Assert.assertNotNull(statement);
            }

            String addUser = "INSERT INTO app_user(login, password, description) VALUES (1234,'valentine','javaMan')";
            PreparedStatement statement = connection.prepareStatement(addUser);
            int rowAffected = statement.executeUpdate();

            Assert.assertNotNull(rowAffected);
            Assert.assertEquals(rowAffected,1);
        }

但是我不喜欢在我的测试中再次创建连接的事实,请注意,由于某些原因,我不能使用对象作为表

就创建JDBC连接而言,我认为有一种优雅的方法可以最大限度地减少您的工作量。 我建议不要每次都创建一个连接,而是编写一个表示JDBC连接的单例类,这样可以避免重复进行一些工作

与以下代码大致相同的内容。(跳过异常和更多详细信息)


就我个人而言,我找到的最好的方法是创建一个静态类
TestUtils
,并添加一个打开和查询数据库的静态方法,以及另一个关闭连接的方法。连接本身是该类的成员。要搜索的SQL查询是一个字符串参数,ResultSet是要返回的值

下面是班级

public class TestUtils {
    private static Connection conn = null;
    private static java.sql.Statement stmt = null;
    private static ResultSet rs;

    public static ResultSet readDB(String sql) throws ClassNotFoundException, SQLException {
        //lettura ladder da db insieme a configs
        // JDBC driver name and database URL
        final String DB_URL = "jdbc:mysql://localhost/sportservicelive";

        //  Database credentials
        final String USER = "root";
        final String PASS = "root";

        //STEP 2: Register JDBC driver
        Class.forName("com.mysql.jdbc.Driver");

        //STEP 3: Open a connection

        conn = DriverManager.getConnection(DB_URL, USER, PASS);

        //STEP 4: Execute a query

        stmt = conn.createStatement();
        rs = stmt.executeQuery(sql);

        return rs;
    }

    public static void closeDB() throws SQLException {
        stmt.close();
        conn.close();
        rs.close();
    }
    [...]
}

当然,它还包含其他各种对单元测试有用的方法。

你能展示一下它的外观吗?我知道一个单例类,但从未使用过这样的模式@Ashutoshthanks@valik我已经添加了代码片段以供参考,希望能有所帮助。这个单例类应该在我的测试类@Ashutosh中,或者在一个单独的类中,您可以将这个单例类放在其中在一个单独的类或包中创建一个类,并在需要时使用它的方法。这就是重点。另外,如果答案有用的话,如果你能投票给我就好了。谢谢。我无法访问该方法,以下是我尝试过的,Database db=Database.getInstance();也尝试过使用“new”,然后在db类本身中添加了类的实例化,但在@Ashutosh中没有添加任何内容
public class TestUtils {
    private static Connection conn = null;
    private static java.sql.Statement stmt = null;
    private static ResultSet rs;

    public static ResultSet readDB(String sql) throws ClassNotFoundException, SQLException {
        //lettura ladder da db insieme a configs
        // JDBC driver name and database URL
        final String DB_URL = "jdbc:mysql://localhost/sportservicelive";

        //  Database credentials
        final String USER = "root";
        final String PASS = "root";

        //STEP 2: Register JDBC driver
        Class.forName("com.mysql.jdbc.Driver");

        //STEP 3: Open a connection

        conn = DriverManager.getConnection(DB_URL, USER, PASS);

        //STEP 4: Execute a query

        stmt = conn.createStatement();
        rs = stmt.executeQuery(sql);

        return rs;
    }

    public static void closeDB() throws SQLException {
        stmt.close();
        conn.close();
        rs.close();
    }
    [...]
}