Java 如何模拟DriverManager.getConnection?

Java 如何模拟DriverManager.getConnection?,java,jdbc,mocking,mockito,Java,Jdbc,Mocking,Mockito,如何模拟DriverManager.getConnection()方法 我想测试我的方法setupConnectionDB() 我用PowerMock、easyMock和Mokito自己试过。我没有发现任何有用的东西 我的代码: import java.io.FileInputStream; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.

如何模拟DriverManager.getConnection()方法

我想测试我的方法setupConnectionDB()

我用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");
这一行从JDBC4.0开始就过时了。您应该能够运行代码而不必担心。或者,如果你认为你需要它,至少也要把它抽象出来

Class.forName(properties.getProperty("dbdriver", "com.mysql.jdbc.Driver");
一旦处理好了,谁说你要嘲笑它?实际上运行它要容易得多

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

这是一些用于以下对象的示例属性:

这样,您不仅可以对setupconnectiondb()进行单元测试,还可以在以后将该连接用于那些需要该数据库中某些数据的方法。

关于此问题的一些注意事项:

Class.forName("com.mysql.jdbc.Driver");
这一行从JDBC4.0开始就过时了。您应该能够运行代码而不必担心。或者,如果你认为你需要它,至少也要把它抽象出来

Class.forName(properties.getProperty("dbdriver", "com.mysql.jdbc.Driver");
一旦处理好了,谁说你要嘲笑它?实际上运行它要容易得多

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

这是一些用于以下对象的示例属性:


这样,您不仅可以负责setupconnectiondb()的单元测试,而且以后还可以将该连接用于那些需要该数据库中某些数据的方法。

您没有提供您的试用版吗?你说我没发现有用的东西是什么意思?从这三个框架中选择一个,让我们知道您面临的挑战是什么?顺便说一句,我不是落选者:)这是一个有效的问题,只要你用所有需要的信息恰当地描述它。目前我正在做学徒,我正在学习TTD。我想测试setUpConnectionToDB()方法,以便正确地创建工作连接。是的,我可以通过连接本地MYSQL来测试它,但这不是重点。因为当我构建并部署我的项目时。不会对MYSQL进行测试。所以我试着只模仿这种方法。不是我要准备的即将发表的声明。或者不使其成为任何seance?mock返回一个假对象,因此如果您模拟
DriverManager.getConnection()
,您的
连接将是一个假对象,您将无法在该
连接上执行任何真正的任务。如果您想进行数据库数据验证,Jan建议的内存数据库是一种方法。您没有提供您的试用版吗?你说我没发现有用的东西是什么意思?从这三个框架中选择一个,让我们知道您面临的挑战是什么?顺便说一句,我不是落选者:)这是一个有效的问题,只要你用所有需要的信息恰当地描述它。目前我正在做学徒,我正在学习TTD。我想测试setUpConnectionToDB()方法,以便正确地创建工作连接。是的,我可以通过连接本地MYSQL来测试它,但这不是重点。因为当我构建并部署我的项目时。不会对MYSQL进行测试。所以我试着只模仿这种方法。不是我要准备的即将发表的声明。或者不使其成为任何seance?mock返回一个假对象,因此如果您模拟
DriverManager.getConnection()
,您的
连接将是一个假对象,您将无法在该
连接上执行任何真正的任务。如果您想进行数据库数据验证,Jan建议的内存内数据库是一个不错的选择。+1用于使用真正的内存内数据库,因为它比模拟数据库更容易。作为h2之外的另一个选项,您可以尝试Derby Embedded,它非常容易设置,并且在mem数据库中也有+1用于使用内存中的真实数据库,因为它比模拟数据库更容易。作为h2之外的另一个选项,您可以尝试Derby Embedded,它非常容易设置,并且在mem数据库中也有。