代码之家  ›  专栏  ›  技术社区  ›  Alexandre

如何模拟实例化为局部变量的类

  •  1
  • Alexandre  · 技术社区  · 16 年前

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

    这个方法首先从一个数据源对象中检索一个JDBC连接,相同的连接被传递给所有DAO实例,所以我可以使用它来控制事务。所以,如果一切正常,我必须在连接对象上调用commit()。

    我想测试一下是否调用了commit(),所以我想创建一个检查它的期望(我使用的是jmock)。但是由于连接类不是我的商务类的直接邻居,我不知道如何做到这一点。

    有人知道如何克服这个问题吗?有一些JMock设施可以解决这个问题,或者有一些替代设计可以解决这个问题?

    谢谢

    6 回复  |  直到 15 年前
        1
  •  3
  •   Jon Skeet    16 年前

    你需要嘲笑 DataSource Connection 所以你的模拟 数据来源 返回您的模拟 连接 . 是的,这种事情最终会变成真正的痛苦…

        2
  •  3
  •   matt b    16 年前

    很难从您的描述中准确地看出类是如何组成的,但是应该通过它的构造函数或 setDataSource() 方法。

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

        3
  •  1
  •   Paul Croarkin    16 年前

    重构,以便将连接注入DAO,将DAO注入业务类。然后您可以模拟DAO和/或连接。您可以很容易地编写自己的mock来扩展连接并重写connect()以设置一个布尔值,稍后您可以通过一个方法(如wasconnectcalled())来检索该布尔值。

        4
  •  1
  •   Jan Kronquist    16 年前

    我绝对推荐你用 spring-jdbc 而不是自己写这种代码。这将确保连接、语句和结果集正确关闭。Spring还有出色的事务管理,所以您不必担心这一点。

    例如,使用SpringJDBC查看这个典型的更新语句:

    public void updateName(int id, String name) {
        getJdbcTemplate().update(
                "update mytable set name = ? where id = ?", 
                new Object[] {name, new Integer(id)});
    }
    
        5
  •  0
  •   argatxa    16 年前

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

    那就可以了。

        6
  •  0
  •   Steve Freeman    15 年前

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