java - 如何创建工厂方法来用功能替换构造函数?

标签 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() 方法的输出。如何将其更改为工厂方法?或者还有其他办法吗?

最佳答案

您可以简单地提供每月付款的 getter 方法:

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

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

  1. 实例化该对象,并向其传递某些值,这些值应产生每月付款的已知值。

  2. 调用 getMontlyPaymet()

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

构造函数中的逻辑是否合适是有争议的。就你的情况而言,我相信是的。构造函数中的此逻辑确保对象始终处于完全初始化状态。如果您要将这个逻辑分解为静态方法,然后将您的测试定位到该方法,您将无法验证对象的状态始终是正确的。

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

关于java - 如何创建工厂方法来用功能替换构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20645230/

相关文章:

java - 错误应用程序引擎 -

java - jdbc executeUpdate 在自动提交模式下失败

junit - 如何在 JUnit 中强制 SQLException

php - Laravel seeder:调用未定义的方法 Illuminate\Notifications\Notification::getConnectionName()

java - HtmlUnit - 将 HtmlPage 转换为 HTML 字符串?

java - 无法使用 HTML 文本在 JLabel 中设置助记词

java - Junit4 : expected=Exception not working with SPRING

java - jUnit 中每个@Test 的不同拆解

testng - 如何在 TestNG 测试类中使用 @Factory 注释和 @Guice

c++ - 使用 boost 工厂在构造函数中传递参数