如何创建工厂方法来替换具有功能的构造函数?

时间:2013-12-17 21:39:35

标签: java junit factory

我目前有一个内置一些功能的构造函数。我知道这不可能是好事。这使得无法在此处测试方法的预期输出。我怎样才能改变它?

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()方法输出。如何将其更改为工厂方法?或者还有另一种方式吗?

3 个答案:

答案 0 :(得分:1)

最简单的方法是将calculateMonthlyPayment()转换为公共静态方法,如

public static BigDecimal calculateMonthlyPayment(BigDecimal amount, 
        BigDecimal interestRate, BigDecimal years) {
    // calculate and return result
}

在构造函数中调用它。然而,从你发布的例子中我看不出为什么你需要一个类,当一个简单的方法就足够了。

答案 1 :(得分:1)

您只需提供每月付款的getter方法:

public double getMonthlyPayment() {
    return this.monthlyPaymentAmount;
}

然后在测试中,执行以下操作:

  1. 实例化对象,并将某些值传递给每月付款的已知值。

  2. 调用getMontlyPaymet()

  3. 将步骤2的结果与步骤1中的预期值进行比较。

  4. 如果逻辑在构造函数中是合适的,那么这是值得商榷的。在你的情况下,我相信它是。构造函数中的此逻辑确保对象始终处于完全初始化状态。如果您将此逻辑分解为静态方法,然后以该方法定位测试,则不会验证对象的状态始终是正确的。

    如果添加其他公共静态方法,则将其作为类的接口提供,这似乎不是您的意图。仅仅为了测试而公开它被称为“测试疤痕”。不要让你的测试损害你班级的设计。

答案 2 :(得分:1)

如果你需要断言calculateMonthlyPayment(),你可以在monthlyPaymentAmount的getter上做一个断言。

一般来说,我在构造函数中并不是很有趣的业务逻辑。因为我只想查看构造函数,所以我建议去static并将这3个参数传递给public static calculateMontlyPayment

P.S:你应该打电话给你的班级Loan,而不是loan。阅读JavaBean conventions