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

标签 java jakarta-ee junit

我正在尝试为 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/

相关文章:

java - 如何为线程run方法编写junit测试用例

Java EE6 优于 EE5?

jakarta-ee - JMS 消费者和消息驱动 Bean (MDB) 之间有什么区别

java - 为什么使用 JUnit 5 运行此 Spring Data JPA Repository 测试会导致 ParameterResolutionException?

Java jsoup链接提取(输出错误)

java - 为什么 Rhino (jsr-223) 不对作为对象属性的字符串求值?

java - 当第一个场景失败时如何跳过所有 cucumber-jvm 场景

java - 如何在 Intellij 中查找字符串中以大写字母开头的单词?

java - 在方法内重用变量是否安全?

java - 如何为特定任务创建 Ant 监听器