我想使用带有黄瓜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,因为我们必须从此方法中的数据库加载。
答案 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中为您运行此类设置。但是,考虑到你不能重构你的代码,这可能不是一个选择。