列表由空记录填充 - junit测试失败

时间:2012-11-30 17:11:37

标签: java

我一直用这个把头撞在墙上一段时间 -

我有一个方法来创建另一个类的对象列表:

    public List <PayrollRecord> processPayroll() {
    List<PayrollRecord> payroll = new ArrayList<PayrollRecord>();
    for (Employee employee : staff) {
        PayrollRecord payRec = new PayrollRecord(employee.getName(), employee.calculatePay());
        payroll.add(payRec);
    }
    return payroll;
}

staff是可以通过此方法添加到列表中的Employee类对象的列表:

    public void addEmployee(Employee employee) {
    staff.add(employee);
}

Employee也是由其他几个类实现的接口 - Manager,SalesAssociate和StoreEmployee。 (你能告诉我我正在尝试完成作业吗?也许你们中的一些人很熟悉)。

PayrollRecord类看起来像这样:

    package my.package.ext;

public class PayrollRecord {

    private String employeeName;
    private double currentPay;

    public PayrollRecord(String employeeName, double currentPay) {

    }

    public double getCurrentPay() {


        return this.currentPay;
        }

        public String getEmployeeName() {
            return this.employeeName;
        }

    }

因此,在测试类中,我应该能够为员工信息创建一些变量,向员工添加一些员工,然后运行processPayroll方法并对其执行一些断言。我的测试类目前看起来像这样(并且还需要更多的断言。在我能解决这个基本问题之前,我不打算添加它们):

    @Test
public void testPayroll() {
    List<PayrollRecord> list = store.processPayroll();
    assertEquals(managerTestPay, list.get(0).getCurrentPay(), 0);
}

根据我在测试类别中添加的员工数量,应该有五个。我可以将list.get设置为超出边界并验证确实存在5.然而问题是所有5条记录都为null且为0.0。我应该有一个名字并支付每个员工的记录。然而,断言错误返回显示我的预期,但实际值为0.0(当我尝试list.get(0).getName())时为null。

提前感谢您的帮助和智慧。

2 个答案:

答案 0 :(得分:2)

你设置会员怎么样?

private String employeeName;
private double currentPay;

public PayrollRecord(String employeeName, double currentPay) {

}

在构造函数中,您需要分配给成员,例如

this.employeeName = employeeName;

仅使用参数调用构造函数是不够的。需要使用参数来填充类的成员(直接或通过一些操作)。

这里有用的技巧是将成员变量设置为final。这意味着:

  1. 初始化后无法更改其值
  2. 您必须立即或在构造函数
  3. 中初始化值

    您可能认为这是一个限制。然而,很多时候你会发现你只设置了一次这个信息(我怀疑你的任务名称和工资将保持不变)。如果您需要更改其中一个,则很容易删除final资格。

    private final String employeeName;
    private final double currentPay;
    
    public PayrollRecord(String employeeName, double currentPay) {
       this.employeeName = employeeName;
       // etc...
    }
    

    确保成员不会更改意味着类实例是不可变的。这通常是件好事。很容易推理和调试不可变类,它们是隐式线程安全的。

答案 1 :(得分:0)

您没有将构造函数参数分配给类变量。将构造函数更新为:

     public PayrollRecord(String employeeName, double currentPay) {
        this.employeeName = employeeName;
        this.currentPay = currentPay;
     }