我想使用一个带有黄瓜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即可为您运行这种类型的设置。但是,考虑到您无法重构代码,这可能不是一种选择。