0

我想使用带有黄瓜 jvm 的功能文件来保存测试数据。

  • 我正在测试一种在处理之前使用休眠加载对象的方法。

    public Deal getDealById(Long dealId) {
       deal = template.get(Deal.class, dealId);
       BigDecimal totalAmount = new BigDecimal();
       //loop through all of the loans related to this deal to add up a value
       for (Loan tempLoan: deal.loanList) {
           //add amount from each loan together
           BigDecimal totalAmount = totalAmount + tempLoan.amount;
       }
       //set the total amount value on the deal object
       deal.setTotalAmount(totalAmount);
       return deal;
    }
    

由于我必须指定要加载的 dealId,我该如何处理加载?

我的理解是我需要“模拟”连接和模拟连接产生的对象。

我分别查看了 Jmock、mockito 和 dbunit,但我不明白该怎么做。

我会很感激任何意见。

编辑注释

我添加了更多代码,我们正在从数据库中检索一个对象。接下来,我们遍历与交易相关的对象列表(多对一),并将每笔贷款的金额添加到交易金额中。最后,我们在返回交易之前设置交易的总金额。

那么,考虑到我想从功能文件中提供测试信息,我该如何为此方法编写 Junit 测试呢?

在“真实”场景中,这是可行的,我们在应用程序中加载交易并添加每笔贷款的贷款金额,并将其设置到交易中,然后再返回。但是考虑到我们必须从该方法中的数据库加载,我不明白如何为此测试编写 JUnit。

4

2 回答 2

1

将逻辑重构到您的Deal类中,您根本不需要模拟数据库。另外,它是更好的面向对象设计。

public Deal getDealById(Long dealId) {
   return template.get(Deal.class, dealId);
}

public class Deal {
   public BigDecimal recalculateTotalLoanAmount() {
      BigDecimal totalAmount = new BigDecimal();
      for (Loan tempLoan: deal.loanList)
         totalAmount = totalAmount + tempLoan.amount;
      setTotalAmount(totalAmount);
      return totalAmount;
   }
}
于 2012-08-07T19:22:15.337 回答
0

我同意 Garrett 的回答,即您应该重构代码。但是,您在评论中表示重构“这不是我的选择”。考虑到这一点,另一种解决方案是使用数据库而不是尝试模拟数据库。

有许多嵌入式内存数据库可用作单元测试的一部分(例如 HSQLDB、H2、Apache Derby)。您在文件中定义数据库模式,以便动态创建数据库。您还可以使用测试数据预加载数据库表,这样您的测试就不必创建它。内存数据库的加载速度非常快。

我强烈建议您使用像Spring这样的 Java 框架,该框架具有方便的配置,只需几行 XML 即可为您运行此类设置。但是,考虑到您无法重构代码,这可能不是一个选择。

于 2012-08-09T15:12:46.730 回答