我目前有一个构造函数,里面有一些功能。我知道这不会是好事。它使得无法测试此处方法的预期输出。我怎样才能改变这个?
public loan(BigDecimal amount, BigDecimal interestRate, BigDecimal years) {
this.amount = amount.multiply(BigDecimal.valueOf(100));
this.interest = interestRate;
this.initialTermMonths = years.multiply(BigDecimal.valueOf(12));
this.monthlyPaymentAmount = calculateMonthlyPayment();
}
我无法进行 JUnit 测试来断言calculateMonthlyPayment() 方法的输出。如何将其更改为工厂方法?或者还有其他办法吗?
最佳答案
您可以简单地提供每月付款的 getter 方法:
public double getMonthlyPayment() {
return this.monthlyPaymentAmount;
}
然后在测试中执行以下操作:
实例化该对象,并向其传递某些值,这些值应产生每月付款的已知值。
调用 getMontlyPaymet()
将步骤 2 的结果与步骤 1 中的预期值进行比较。
构造函数中的逻辑是否合适是有争议的。就你的情况而言,我相信是的。构造函数中的此逻辑确保对象始终处于完全初始化状态。如果您要将这个逻辑分解为静态方法,然后将您的测试定位到该方法,您将无法验证对象的状态始终是正确的。
如果添加额外的公共(public)静态方法,则将其作为类的接口(interface)提供,这似乎不是您的意图。仅仅为了测试而公开它被称为“测试疤痕”。不要让您的测试损害您的类的设计。
关于java - 如何创建工厂方法来用功能替换构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20645230/