java - 如何模拟DriverManager.getConnection?

标签 java jdbc mocking mockito

如何模拟 DriverManager.getConnection() 方法?

我想测试我的方法 setUpConnectiontoDB()

我用 PowerMock、easyMock 和 Mokito 本身进行了尝试。我没有发现任何有用的东西。

我的代码:

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class MysqlDAO implements DAO {
    private final Properties properties = new Properties();

    public MysqlDAO(String configPath) {
        loadProperties(configPath);
    }

    private Properties loadProperties(String configPath) {
        try {
            properties.load(new FileInputStream(configPath));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return this.properties;
    }

    @Override
    public Connection setUpConnectionToDB() {
        try {
            Class.forName("com.mysql.jdbc.Driver");

            return DriverManager.getConnection(
                    properties.getProperty("url"),
                    properties.getProperty("user"),
                    properties.getProperty("passwd"));

        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
}

最佳答案

一些注意事项:

Class.forName("com.mysql.jdbc.Driver");

此行自 JDBC 4.0 起已过时。您应该能够在没有的情况下运行代码。或者,如果您认为需要它,至少也可以将其抽象化

Class.forName(properties.getProperty("dbdriver", "com.mysql.jdbc.Driver");

一旦解决了这个问题,谁说你必须 mock 它​​?实际运行它要容易得多。

您也可以使用内存数据库(如 h2)进行测试并检查您的代码。您需要更改的只是 url、user 和 passwd 属性。

这将是与 h2 一起使用的一些示例属性:

dbdriver = org.h2.Driver
url = jdbc:h2:mem:test
user = sa
passwd = sa

这样,您不仅可以处理 setUpConnectionToDB() 的单元测试,而且稍后可以将该连接用于需要该数据库中某些数据的方法。

关于java - 如何模拟DriverManager.getConnection?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34674619/

相关文章:

java - 单元测试覆盖调用 super() 的方法

java - Java 上的正则表达式日期格式验证

java - 为什么 FileWriter 会覆盖文件,即使我确实指定它应该附加

asp.net - HttpContext最全的mock框架是什么

unit-testing - 在 Dart 中重构友好的模拟

java - 无论如何,是否可以设置取决于流链内流的结果的值

sql - 来自 PostgreSQL 函数的多个 JDBC 结果集

java - 连接空闲后出现 SQLException

java - 如何使用java计算数据库中的日期与当前日期之间的天数差异

c# - 模拟具有不同签名的方法,其中一个方法具有 Object 作为参数类型