HourlyEmployee and SalariedEmployee


1.1  Introduction

Volunteer work is admirable, but many people enjoy being paid 
for the work they do for an employer. Depending on the type of 
employee, said employee may be paid by the hour, a fifixed rate 
(salaried), or be on some bonus/commission payment scale.

For this assignment, I provide an interface called IEmployee. Do 
not modify, extend, or in any way alter this interface - other than 
to embellish the JavaDoc if required to pass the checkStyle tests.

You will create two concrete classes that implement this 
interface: HourlyEmployee and SalariedEmployee. You will 
also provide a test class that will test your code. This class must 
be named IEmployeeTest.

1.2  What to do

EMPLOYEES

All of your assets for this assignment must be placed in a 
package named student.

We're dealing with money for this example (US dollars). Consider 
investigating the BigDecimal and DecimalFormat classes to 
help you deal with fractional items. The rounding mode you 
should use for this assignment is RoundingMode.HALF_UP (in 
other words, round up the fractional parts beyond the second 
decimal place)

You must implement the provided IEmployee interface.

package student;
/**
 * An interface representing the concept of Employees.
Note: This assignment is a bit difffferent from the previous homework, and asks you to 
practice with JUnit 5. Ensure you read the instructions carefully and submit what is 
required. */
public interface IEmployee {
 // NOTES (you may remove these notes after you understand the assignment if they 
cause checkStyle issues): 
 // The max HOURLY base salary is $50.00 (per hour). 
 // The max Salaried base salary is $1 million per year.
 // HourlyEmployees earn 1.5x base salary for any time worked > 40 hours in a 
period.
 // SalariedEmployees are paid monthly. For one pay period their salary should be 
baseSalary/12
 
 /**
 * @return the employee's pay for the given period.
 * Hourly employees are paid weekly based on the number of hours worked.
 * Salaried employees are paid monthly, with a given paycheck of 1/12 their yearly 
salary
 *
 */
 double getPayForThisPeriod();
 /**
 * @return the employee's base salary.
 * Hourly employees answer their hourly rate.
 * Salaried employees answer their yearly salary
 */
 double getBaseSalary();
 /**
 * @param raisePercent raises the employee's base salary from 0% (minimum) to 10% 
maximum.
 * The parameter is a value between 0.0 and 10.0. This method converts that value 
to a decimal value
 * 0 - 0.10 when required for calculations.
 */
 void giveRaiseByPercent(double raisePercent);
 /**
 * @return Returns employee ID.
 */
 String getID();
 /**
 * @return Returns employee name.
 */
 String getName();
}
Create two concrete classes (remember, both of these classes 
should be created in the student package as 
well): HourlyEmployee and SalariedEmployee.
Your HourlyEmployee class must include a constructor that 
follows this signature:

public HourlyEmployee(String name, String id, double hourlySalary, double normalHours)
HourlyEmployees also have an additional method NOT listed 
in the shared interface:

/**
 * This method allows HourlyEmployees to supersede the number of hours worked for the 
week.
 */
public void setSpecialHours(double hours)
HourlyEmployees have a name, ID, and an hourly salary. When 
created, these employees specify the "normal" number of hours 
they typically work each week. The weekly hours cannot be  less 
than zero (0) and cannot be more than 80.0. If this constraint is 
not met, your HourlyEmployee should throw 
an IllegalArgumentException.

An HourlyEmployee also gets paid "time and one-half" (1.5x) 
for any hours worked over 40.0 
hours. HourlyEmployees override their "normal" hours by 
calling the setSpecialHours() method. By calling this 
method, an HourlyEmployee temporarily sets their "hours for 
the week" to the value passed to this method (same constraints 
as described above - the value must be between 0 and 80.0 
hours).
This "override" does not persist, so after the 
method getPayForThisPeriod() is called, the employee's 
"normal hours" are re-activated for any subsequent payments.

Your SalariedEmployee class must include a constructor that 
follows this signature:

public SalariedEmployee(String name, String id, double yearlySalary)
For both types of employees, if their constructors are given a 
salary less than zero (0) or greater than the maximum allowable 
salary (based on the type of employee), throw 
an IllegalArgumentException.For both types of employees, if their constructors are given null 
or an empty String ("") for either the name or ID, throw 
an IllegalArgumentException.

When the giveRaiseByPercent() method is called for either 
type of employee, the base salary for the employee object should 
be increased by the percentage specifified by the parameter 
passed in. Allowable values for the raise percentage is any 
number between 0 and 10.0. Any value outside of this range 
should raise an IllegalArgumentException.
Note: The maximum salary constraint must be maintained during 
this operation. Therefore, if a "raise" request would take the 
employee's salary above the maximum, this request should be 
ignored. Do NOT throw an exception. Instead, leave the 
employee's salary unchanged.

void giveRaiseByPercent(double raisePercent);
 

IEmployeeTest

Design your IEmployeeTest class to be a JUnit5 test class. 
Here is some starter code - you may opt to use this if you wish:

// This is a placeholder for student code.
package student;
import org.junit.jupiter.api.*;
import static org.junit.jupiter.api.Assertions.*;
public class IEmployeeTest {
    HourlyEmployee snoopyHours = new HourlyEmployee("Snoopy", "111-CHLY-BRWN", 17.50, 
20);
 SalariedEmployee lucy = new SalariedEmployee("Lucy", "222-22-2222", 70000.00);
 IEmployee woodStock = new SalariedEmployee("Woodstock", "33-CHIRP", 180000.50);;
 // sample test provided to students
 @Test
 public void testGetErrorWhenCreatingEmployee() {
 Assertions.assertThrows(IllegalArgumentException.class, () -> { IEmployee e = new HourlyEmployee(null, null, 15.51, 30);
 });
 Assertions.assertThrows(IllegalArgumentException.class, () -> {
 IEmployee e = new HourlyEmployee("Part-timer", "PT-TIME", -1, 30);
 });
 }
 @Test
 public void testGetHappyDayEmployee() {
 }
 @Test
 public void testGetPayForThisPeriod() {
 }
 @Test
 public void testGetBaseSalary() {
 }
 @Test
 public void testGetID() {
 }
 @Test
 public void testGetName() {
 }
}
Note: Unlike our the assignments we'll be doing for the rest of 
the semester, I'm asking you to place ALL of your assets in the 
same package (the one called student).

You need to have the six methods prefifixed by "testGet" methods 
above. The automated grader we're using for this assignment is 
difffferent than the one used on homework 1 & 2, so your test 
methods need to follow this form. Spelling and case-sensitivity is 
important here so I suggest you copy the template given above.

You should write more tests than what I've given you here. 
However, at the very least, be sure you develop the six "starter 
tests" I've given you.
Notes:

For this assignment, we'll be running your JUnit tests against 
your code, our exemplar code (what we think is correct) and a 
sample of code in which we have purposely injected some bugs/
defects. Of course, your tests should validate your code (and 
your solution should pass your tests). Additionally, your JUnit 
tests will be evaluated on how well it exercises our code (and 
detects the errors we have in the "buggy" solution). We'll also be 
running a test code coverage analyzer to see how much of your 
solution code you test with your JUnit. Part of your grade will be 
calculated based on code coverage (of your own code, not of 
ours).

You should provide a suitable .toString() method for 
Employees:
Name: Clark Kent
ID: SUPS-111
Base Salary: $416.50
As part of your submission, remember:

• Create a UML class diagram that describes your solution 
and include it with your submission

继承多态综合应用练习 2定义一个抽象的 People 类,有姓名(name),年龄(age),性别(sex)等成员变量,要求成员变量的访问修饰符为 private,通过 getXxx()和 setXxx()方法对各变量进行读写。声明具有一个抽象的 role()方法,该方法不返回任何值,用于输出人的身份类型,同时至少定义两个构造方法。定义一个抽象类 Employee 类,该类继承 People 类,该类具有 People 类的所有成员,并新增雇员底薪薪水(salary)和职工编号(empid)成员变量。同样要有至少两个构造方法,要体现出 this 和 super 的几种用法。声明具有一个抽象的getSalary()方法,该方法返回 float 值,用于返回员工薪水。定义 SalariedEmployee 类,它是 Employee 的子类,拿固定工资的员工,他的薪水就是底薪。重写 role 和getSalary 方法。定义 HourlyEmployee 类,它是 Employee 的子类,按小时拿工资的员工,每月工作超出 160 小时的部分按照 1.5 倍工资发放。新增属性:每小时的工资(hourSalary)、每月工作的小时数(hourWork)。重写 role 和getSalary 方法。定义 SalesEmployee 类,它是 Employee 的子类,销售人员,工资由月销售额和提成率决定。新增属性:月销售额(saleMoney)、提成率(rate)定义一个类 Company,在该类中写一个方法 print(Employee e),调用该方法可以打印出某个员工的工资数额以及该员工的身份类型,写一个测试类 CompanyTest 在 main 方法,把若干各种类型的员工放在一个 Employee 数组里,并调用 print 方法输出数组中每个员工当月的工资。要求:测试类放在包名为 com.sy4.exe02.test 包中,其它类放在 com.sy4.exa02 包中。
04-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值