Java:JUnit、继承和@15db9742?

Java: JUnit, Inheritance & @15db9742?

这是一个简单的 Java 应用程序,它通过汇总该部门所有员工的月工资来计算该部门的每月开支。一个部门的员工按 层级排列: (测试人员支付 500.0,&,开发人员支付 1000.0,在经理手下支付 300.0,在经理手下支付 300.0)。

这样,ManagerA的总费用应该是2100.0。总费用是部门每月的费用。

我打算构建一个执行此操作的应用程序,然后通过测试 getTotalExpenses() 的 return 来证明它应该是 2100.0.

我构建了测试,测试失败(pic):

所以我构建了一个包含大量 println()main() 来查看发生了什么并得到了一些非常意外的输出(pic):

monDepExpensesApp.QATester@15db9742
monDepExpensesApp.Developer@6d06d69c
monDepExpensesApp.Manager@7852e922
monDepExpensesApp.Manager@7852e922
monDepExpensesApp.Manager@4e25154f
monDepExpensesApp.Manager@4e25154f

所有文档化的源代码在下面,它解释了很多。

但这些是我的问题:

我从未在 Java.

见过这样的东西

注意:我构建 main 只是为了告诉我更多关于我的测试失败的原因。 注:第二题已回答

感谢您的浏览,我很想看看您的想法。

员工

package monDepExpensesApp;

/**
 * Employee declares expenses, & getExpenses().
 * 
 * Employee is the superclass of Manager, QATester, and Developer.
 * 
 * @author Reed
 */
public class Employee {
    protected double expenses;

    /**
     * getExpenses() returns the monthly allocation amount of a Manager, Developer, or QATester object.
     * @return a double values representing what the specified Employee is paid each month.
     */
    public double getExpenses() {
        return expenses;
    }
}

开发人员

package monDepExpensesApp;

/**
 * Developers warrant a monthly allocation of 00.00, per Developer.
 * 
 * Developer extends Employee.
 * 
 * @author Reed
 */
public class Developer extends Employee {

    /**
     * Developer() creates a Developer, who is paid 00.0 a month.
     */
    public Developer() {
        expenses = 1000.0;
    }
}

QATester

package monDepExpensesApp;

/**
 * QA Testers warrant a monthly allocation of 0.00, per QA Tester.
 * 
 * QATester extends Employee.
 * 
 * @author Reed
 */
public class QATester extends Employee {

    /**
     * QATester() creates a QA Tester, who is paid 0.0 a month.
     */
    public QATester() {
        expenses = 500.0;
    }
}

经理

package monDepExpensesApp;

import java.util.ArrayList;

/**
 * Managers warrant a monthly allocation of 0.00, per Manager.
 * 
 * A manager is at the top of a hierarchical relationship,
 * in which one manager oversees employees such as developers,
 * QA testers, & other managers. A hierarchy is constituted of all the 
 * employees of a department. An employee's title is associated with
 * an amount paid monthly. A departments monthly expenses can be determined 
 * by adding the amounts paid to the employees in a hierarchy.
 * 
 * Manager extends Employee.
 * 
 * @author Reed
 */
public class Manager extends Employee {
    private ArrayList<Employee> employeeList = new ArrayList<>();

    /**
     * Manager() creates a Manager, who is paid 0.0 a month.
     */
    public Manager() {
        expenses = 300.0;
    }

    /**
     * Add() adds employees to a list.
     * @param employee
     */
    public void add(Employee employee) {
        employeeList.add(employee);
    }

    /**
     * getTotalExpenses() adds the values in employeeList,
     * calculating a departments total monthly expenses.
     * @return the value of totalExpenses.
     */
    public double getTotalExpenses() {
        double totalExpenses = 0.00;

        for(Employee employee : employeeList) {
            totalExpenses += employee.getExpenses();
        }
        return totalExpenses;
    }
}

DepOneExpTest

package monDepExpensesApp.UnitTest;

import static org.junit.Assert.*;
import monDepExpensesApp.Developer;
import monDepExpensesApp.Manager;
import monDepExpensesApp.QATester;
import org.junit.Test;

/**
 * DepOneExpTest evaluates a departments actual total expenses,
 * by comparing them to a projected total.
 * 
 * @author Reed
 */
public class DepOneExpTest {

    /**
     * testOne() compares a departments actual total expenses with a projected total of 00.00.
     * This departments employees create the following hierarchy:
     * managerA <-- managerB <-- tester1 &  dev1.
     */
    @Test
    public void test() {
        QATester tester1 = new QATester(); 
        Developer dev1 = new Developer(); 

        Manager managerB = new Manager(); 
        managerB.add(tester1);
        managerB.add(dev1);

        Manager managerA = new Manager();
        managerA.add(managerB);

        assertEquals(2100.0, managerA.getTotalExpenses(), 0.001);
    }

}

Main2

package monDepExpensesApp;

public class Main2 {

    public static void main(String[] args) {
        QATester tester1 = new QATester();
        System.out.println(tester1);

        Developer dev1 = new Developer(); 
        System.out.println(dev1);

        Manager managerB = new Manager();
        System.out.println(managerB);

        managerB.add(tester1);
        managerB.add(dev1);
        System.out.println(managerB);

        Manager managerA = new Manager();
        System.out.println(managerA);

        managerA.add(managerB);
        System.out.println(managerA);
    }

}

只需将以下内容添加到 Employee class 即可解决您的问题

@Override
public String toString() {
   //return something sensible like the Employee Name
    return getEmployeeName();
}

当您打印 object 时,它只是打印调用 toString() 的结果。默认 toString() 实现将 return 包含 class 名称和哈希码表示的字符串(有关详细信息,请参阅 toString() Javadoc)。正如其他人所指出的,您可以通过覆盖 toString():

来改进
@Override
public String toString() {
  return expenses + " " + employeeList;
}

你的问题在这里:

totalExpenses += employee.getExpenses();

这会增加 children 的费用,但不会增加 grandchildren 的费用。你想要:

totalExpenses += employee.getTotalExpenses();

您可能还希望 getTotalExpenses() 依赖于 expenses 字段。