我该怎么做 Cucumber JVM/JUnit 的数据库加载?



我想使用一个带有黄瓜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,因为我们必须从此方法中的数据库加载。

将逻辑重构到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;
   }
}

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

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

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

最新更新