科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件利用HSQLDB进行Hibernate单元测试(2)

利用HSQLDB进行Hibernate单元测试(2)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文告诉您如何通过使用HSQLDB和Hibernate强大的模式生成工具,对应用程序映射层进行单元测试,并在对象查询中找到不计其数的bug。

作者:佚名 来源:天极网  2007年8月31日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

那么单元测试中的外部特征是什么?下面的测试代码片段是用来检查逻辑的,决定运动员在棒球联盟比赛中是哪个位置的人选:

public void testGetEligiblePositions() throws Exception {

Player player = new Player("playerId");

TestSchema.addPlayer(player);

FieldingStint stint1 = new FieldingStint("playerId", 2004, "SEA", Position.CATCHER);

stint1.setGames(20);

TestSchema.addFieldingStint(stint1);

Set positions = player.getEligiblePositions(2004);

assertEquals(1, positions.size());

assertTrue(positions.contains(Position.CATCHER));

}

第一次创建新Player实例并通过addPlayer()方法添加到TestSchema中。必须首先完成此步骤,因为FidldStint类和Player类之间有外键关系。如果不首先添加该实例,在设法添加FieldingStint时将会出现外键约束违例。一旦测试上下文就位,就可以测试getEligiblePositions()方法来检索校正数据。下面是在TsetSchema中addPlayer()方法的代码。您将注意到使用Hibernate而不是bare-metal JDBC代码:

public static void addPlayer(Player player) {

if (player.getPlayerId() == null) {

throw new IllegalArgumentException("No primary key specified");

}

Session session = HibernateUtil.getSession();

Transaction transaction = session.beginTransaction();

try {

session.save(player, player.getPlayerId());

transaction.commit();

}

finally {

session.close();

}

}

在单元测试中最重要的就是要保持测试实例是独立的。因为该方法仍然涉及数据库,所以需要一种方法在每个测试实例之前清理数据库。在我的数据库架构中有四个表,所以我在TestSchemaz上编写了reset()方法,该方法从使用JDBC的表中删除所有行。注意,因为HSQLDB能识别外键,删除表的顺序是很重要的,下面是代码:

public static void reset() throws SchemaException {

Session session = HibernateUtil.getSession();

try {

Connection connection = session.connection();

try {

Statement statement = connection.createStatement();

try {

statement.executeUpdate("delete from Batting");

statement.executeUpdate("delete from Fielding");

statement.executeUpdate("delete from Pitching");

statement.executeUpdate("delete from Player");

connection.commit();

}

finally {

statement.close();

}

}

catch (HibernateException e) {

connection.rollback();

throw new SchemaException(e);

}

catch (SQLException e) {

connection.rollback();

throw new SchemaException(e);

}

}

catch (SQLException e) {

throw new SchemaException(e);

}

finally {

session.close();

}

}

当确定在Hibernate 3.0中进行大量删除操作时,应该能从应用程序中删除直接JDBC的最后一位。到此时为止,必须获取数据库连接并向数据库直接提交SQL。 在确保没有关闭连接的情况下,为了释放资源,只关闭会话就足够了。出于手工编写许多JCBC代码来进行开发的习惯,第一个版本关闭了JDBC连接。因为通过配置Hibernate创建的连接池只带有一个链接,在第一个之后就完全破坏了测试。一定要注意这种情况! 既然在测试类运行时(设想运行所有的测试实例)不能确定数据库的状态,应该在setUp()方法中包含数据库清除,如下所示:

public void setUp() throws Exception {

TestSchema.reset();

}

结束语

在使用像Hibernate这种复杂的O/R映射程序时,必须能够测试实际存在(real-live)的RDBMS,而不会发生任何针对已部署数据库的争论。虽然Hibernate有内置模式生成工具,让此类测试特别简单,但是在这里展示的例子并不排除Hibernate,并且可能与JDO或TopLink一起运行。使用上面描述的设置,您不必离开舒适的IDE环境,但仍然可以对代码进行大量测试。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章