1

我正在为调用一些 DAO 类以对数据库执行操作的业务方法编写测试。

这个方法,首先从 DataSource 对象中检索一个 JDBC 连接,将相同的连接传递给所有 DAO 实例,所以我可以用它来控制事务。因此,如果一切正常,我必须通过连接对象调用 commit()。

我想测试是否调用了 commit(),所以我想创建一个检查它的期望(我正在使用 JMock)。但由于 Connection 类不是我的 Business 类的直接邻居,我不知道该怎么做。

有人知道如何克服这个吗?有一些 JMock 工具可以解决这个问题,还是有一些替代设计可以克服这个问题?

谢谢

4

6 回答 6

3

您需要模拟DataSource Connection以便您的模拟DataSource返回您的模拟Connection。是的,这种事情最终变成了真正的痛苦……

于 2008-10-24T13:17:33.627 回答
3

我很难从您的描述中确切地知道您的类是如何组成的,但是 DataSource 应该通过它的构造函数或setDataSource()方法注入到您的 DAO 类中。

这将允许您单独测试 DAO,并允许您在单元测试中构建模拟 DataSource 并将其传递给正在测试的 DAO。

于 2008-10-24T13:18:38.493 回答
1

重构以便将 Connection 注入到 Dao 中,并将 Dao 注入到业务类中。然后,您可以模拟 Dao 和/或 Connection。您可以轻松编写自己的模拟来扩展 Connection 并覆盖 connect() 以设置一个布尔值,稍后您可以通过诸如 wasConnectCalled() 之类的编写方法检索该布尔值。

于 2008-10-24T13:48:28.340 回答
1

我肯定会建议您使用spring-jdbc而不是自己尝试编写这种代码。这将确保正确关闭连接、语句和结果集。Spring 还具有出色的事务管理,因此您根本不必担心这一点。

例如,看看这个使用 spring-jdbc 的典型更新语句:

public void updateName(int id, String name) {
    getJdbcTemplate().update(
            "update mytable set name = ? where id = ?", 
            new Object[] {name, new Integer(id)});
}
于 2009-01-28T19:52:37.950 回答
0

使 bussines 类从全局/静态对象工厂检索局部变量。这样,您可以将工厂置于测试模式并使其返回模拟对象而不是真实对象。

那应该可以。

于 2008-10-24T13:21:26.660 回答
0

@Paul 附议。一旦你将连接的管理分离出来,你就可以在一个回调中编写其余的行为,然后将它传递给拥有连接的东西——比如 UnitOfWork。连接所有者处理事务,并将连接传递给 UnitOfWork。事务在一个地方——易于测试,UnitOfWork 在另一个地方,使用模拟连接进行测试。

于 2009-05-21T18:22:58.277 回答