java.sql.DriverManager无法识别java.sql.Driver存根

时间:2011-07-22 15:19:31

标签: java mysql unit-testing jdbc

我正在尝试对我编写的瘦数据访问层进行单元测试。我希望我不必将DriverManager的存根注入到建立连接的类中,并且我没有可用的模拟框架。我已经检查了我对MockRunner's MockDriver的实现,它非常相似,但是当我运行测试时,我得到一个SQLException:“没有为jdbc找到合适的驱动程序:mysql:// localhost:3306。”这是存根代码:

public class DriverStub implements Driver
{
    @Override
    public boolean acceptsURL(String URL) throws SQLException
    {
        return true;
    }
    @Override
    public Connection connect(String url, Properties info) throws SQLException
    {
        return new ConnectionStub();
    }
    @Override
    public int getMajorVersion()
    {
        return 1;
    }
    @Override
    public int getMinorVersion()
    {
        return 0;
    }
    @Override
    public DriverPropertyInfo[] getPropertyInfo(String url, Properties info)
    throws SQLException
    {
        return new DriverPropertyInfo[0];
    }
    @Override
    public boolean jdbcCompliant()
    {
        return true;
    }
}

调用代码的一个片段:

Connection connection = null;
try
{
    Class.forName(driver).newInstance();
}
...
try
{
    connection = Drivermanager.getConnection(...);
}
...

2 个答案:

答案 0 :(得分:2)

Driver实现应在其静态初始化程序中注册DriverDriverManager.registerDriver的实例。

public class DriverStub implements Driver {
    static {
        java.sql.DriverManager.registerDriver(new DriverStub());
    }
    ...
}

这是一个完整而彻底的黑客,但你去了。就个人而言,我建议忽略DriverManager并直接链接到驱动程序。

答案 1 :(得分:0)

这似乎比它的价值要大得多。为什么要存根DriverManager?那测试是什么?如何通过不使用真正的驱动程序管理器来证明数据访问层的价值?您不想连接到数据库进行测试吗?

我将加载JDBC驱动程序并完成它。这对我来说似乎是嘲笑。