gpt4 book ai didi

java - 在 J2ee 应用程序上为 DAO 编写测试用例

转载 作者:行者123 更新时间:2023-12-04 07:02:03 25 4
gpt4 key购买 nike

我正在尝试为 J2EE 应用程序中的 DAO 类编写一些测试用例。我的 DAO 类中的方法尝试根据 JDBC URL(位于应用程序服务器上)连接到数据库。所以从前端,如果我点击一堆东西并让 DAO 触发它运行良好。但是,当我为 DAO 编写测试用例并且 DAO 对象调用该方法时,它无法获得与数据库的连接。我认为由于 JDBC 资源在 App 服务器上,这就是它不能从测试类工作的原因。

因此,当我运行测试而不是通过或失败时..它返回一堆错误。

有人遇到过这个问题吗?我能做些什么来克服这个?

例子:

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 查找。您有两个不同的来源来获取 DataSource 或 Connection - 一个用于应用程序,另一个用于测试。

更新:

这就是我的意思,用您的代码表示:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com