我正在尝试为 J2EE 应用程序中的 DAO 类编写一些测试用例。我的 DAO 类中的方法尝试根据 JDBC URL(位于应用程序服务器上)连接到数据库。因此,如果我从前端单击一堆东西并触发 DAO,它就会正常运行。但是,当我为 DAO 编写测试用例并且 DAO 对象调用该方法时,它无法获得与数据库的连接。我认为由于 JDBC 资源位于应用程序服务器上,这就是它无法在测试类中工作的原因。
因此,当我运行测试而不是通过或失败时......它会返回一堆错误。
有人遇到过这个问题吗?我能做些什么来克服这个问题?
示例:
public class DBConnectionManager {
public static final String DB_URL = "jdbc/RSRC/my/connection/mydb"
public Connection getconnection ()
{
DataSource ds = ServiceLocator.getInstance().getDataSource(DB_URL);
return ds.getconnection();
}
}
public class MyDAO extends DBConnectionManager {
publci SomeBean getContents (String id)
{
Connection con = getConnection();
CallableStatement cs = con.prepareCall("{call myStorProc(?)}");
cs.setString(1, id);
...
//code to call resultset and retrieve SomeBean goes here
..
return SomeBean;
}
}
public class MyTests extends TestCase {
public testGetcontents ()
{
MyDAO myd = new MyDAO ();
SomeBean smb = myd.getContents("someparm");
assertEquals (5, smb.getSomeVal());
}
}
我应该在我的测试用例中做一些额外的事情......?如果是这样怎么办?
编辑:
我得到的错误是:
java.lang.NoClassDefFoundError: com/iplanet/ias/admin/common/ASException
at java.lang.ClassLoader.defineClass1(Native Method)
最佳答案
您的 DAO 有一个硬连接到其中的 JNDI 查找字符串。除非您有可用的 JNDI 查找服务,否则它将无法获得连接。
我认为 DAO 不应该负责获取数据库连接。这种设计不允许您为工作单元设置事务,因为 DAO 无法知道它是否是更大工作单元的一部分。
我建议将连接传递到 DAO 中,也许传递到它的构造函数中。这样,如果单个工作单元中有多个 DAO,服务层就可以建立适当的事务边界。
此设计还有一个额外的好处,即使您的应用程序可以适本地使用其 JNDI 资源,并且您的测试可以从 DriverManager 获取其连接,而无需使用 JNDI 查找。您有两种不同的来源来获取数据源或连接 - 一种用于应用程序,另一种用于测试。
更新:
这就是我在代码中表达的意思:
public class DBConnectionManager
{
public static final String DB_URL = "jdbc/RSRC/my/connection/mydb"
public Connection getConnection (String jndiLookup)
{
DataSource ds = ServiceLocator.getInstance().getDataSource(jndiLookup);
return ds.getconnection();
}
public Connection getConnection(String driver, String url, String username, String password)
throws ClassNotFoundException, SQLException
{
Class.forName(driver);
return DriverManager.getConnection(url, username, password);
}
}
public class MyDAO
{
private Connection connection;
public MyDao(Connection connection)
{
this.connection = connection;
}
public SomeBean getContents (String id)
{
CallableStatement cs = this.connection.prepareCall("{call myStorProc(?)}");
this.connection.setString(1, id);
//code to call resultset and retrieve SomeBean goes here
return someBean;
}
}
您没有显示任何有关正确关闭资源或事务的内容。从这段代码来看,您在这两方面都会遇到麻烦。我会仔细考虑您的实现。
我会向您推荐 Spring JDBC。您可以在 Spring 中编写 DAO,而无需重写整个应用程序。
我还要指出,您可能也在考虑泛型:Don't Repeat The DAO .
关于java - 在 J2ee 应用程序上为 DAO 编写测试用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1698212/