如何使用Cucumber JVM / JUnit进行数据库加载

时间:2012-08-07 15:36:09

标签: java junit mockito cucumber-jvm cucumber-junit

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

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

    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,因为我们必须从此方法中的数据库加载。

2 个答案:

答案 0 :(得分:1)

将逻辑重构到Deal类中,您根本不需要模拟数据库。此外,它还有更好的OO设计。

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;
   }
}

答案 1 :(得分:0)

我同意Garrett的回答,你应该重构你的代码。但是,您在评论中已说明重构"它不适合我" 。考虑到这一点,另一种解决方案是使用数据库而不是试图模拟数据库。

有许多embedded in-memory databases可用作单元测试的一部分(例如HSQLDB,H2,Apache Derby)。您可以在文件中定义数据库模式,以便即时创建数据库。您还可以使用测试数据预加载数据库表,这样您的测试就无需创建它。内存数据库的加载速度非常快。

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