这次更新我将Money类中各种计算模式的算法封装到了Arithmetic算法类中,以便代码复用及代码测试。但是由于单元测试无法测试private修饰的方法,所以我将Arithmetic中的方法访问修饰符设为public,本次测试采用的工具是JUnit4,需要导入的包有org.junit.*以及org.hamcrest.CoreMatchers.*。
以下为修改后的源代码
主类Money
import java.util.Scanner;
public class Money {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入计算方式:1.单利计算 2.复利计算 3.本金计算 4.股票期限计算 5.利率计算 6.资产总值计算");
// 选择计算方式
int choose = scanner.nextInt();
switch (choose) {
case 1:
danLiJiSuan(scanner); // 1.单利计算模式
break;
case 2:
fuLiJiSuan(scanner); // 2.复利计算模式
break;
case 3:
benJinJiSuan(scanner); // 3.本金计算模式
break;
case 4:
guPiaoQiXian(scanner); // 4.股票计算模式
break;
case 5:
liLvJiSuan(scanner); // 5.利率计算模式
break;
case 6:
ziChanZongZhi(scanner); // 6.资产计算模式
break;
}
scanner.close();
}
// 6.资产总值计算模式
public static void ziChanZongZhi(Scanner scanner) {
double P;
double i;
double N;
double F;
System.out.println("请输入本金:");
P = scanner.nextDouble();
System.out.println("请输入每年的投资金额:");
double T = scanner.nextDouble();
System.out.println("请输入投资年限:");
N = scanner.nextInt();
System.out.println("请输入利率:");
i = scanner.nextDouble();
// 调用计算方法
F = Arithmetic.wayOfZiChanZongzhi(P, i, N, T);
System.out.println("资产总值是:" + F);
}
// 5.利率计算模式
public static void liLvJiSuan(Scanner scanner) {
double P;
double i;
double N;
double F;
System.out.println("输入本金:");
P = scanner.nextDouble();
System.out.println("输入期限:");
N = scanner.nextDouble();
System.out.println("输入本息总值:");
F = scanner.nextDouble();
// 调用计算方法
i = Arithmetic.wayOfLiLvJiSuan(P, N, F);
System.out.println("利率为:" + i);
}
// 4.股票期限计算模式
public static void guPiaoQiXian(Scanner scanner) {
double P;
double i;
double N;
double F;
System.out.println("输入本金:");
P = scanner.nextDouble();
System.out.println("输入利率:");
i = scanner.nextDouble();
System.out.println("输入本息总值:");
F = scanner.nextDouble();
// 调用计算方法
N = Arithmetic.wayOfGuPiaoQiXian(F, P, i);
System.out.println("期限为:" + N);
}
// 3.本金计算模式
public static void benJinJiSuan(Scanner scanner) {
double P;
double i;
double N;
double F;
System.out.println("输入本息总值:");
F = scanner.nextDouble();
System.out.println("输入利率:");
i = scanner.nextDouble();
System.out.println("输入期限:");
N = scanner.nextDouble();
// 调用计算方法
P = Arithmetic.wayOfBenJinJiSuan(i, N, F);
System.out.println("应投入本金:" + P);
}
// 2.复利计算模式
public static void fuLiJiSuan(Scanner scanner) {
double P;
double i;
double N;
double F;
System.out.println("输入本金:");
P = scanner.nextDouble();
System.out.println("输入利率:");
i = scanner.nextDouble();
System.out.println("输入期限:");
N = scanner.nextDouble();
// 调用计算方法
F = Arithmetic.wayOfFuLiJiSuan(P, i, N);
System.out.println("本息总值为:" + F);
}
// 1.单利计算模式
public static void danLiJiSuan(Scanner scanner) {
double P;
double i;
double N;
double F;
System.out.println("输入本金:");
P = scanner.nextDouble();
System.out.println("输入利率:");
i = scanner.nextDouble();
System.out.println("输入期限:");
N = scanner.nextDouble();
F = Arithmetic.wayOfDanLiJiSuan(P, i, N);
System.out.println("本息总值为:" + Math.round(F * 100) / 100.0);
}
算法类Arithmetic
/** 封装复利计算程序的算法*/
public class Arithmetic {
//资产总值计算模式的算法
public static double wayOfZiChanZongzhi(double P, double i, double N, double T) {
double F;
for (int j = 0; j < N; j++) {
P = P * (1 + i);
P = P + T;
}
F = Math.round((P - T) * 100) / 100.0;
return F;
}
//利率计算模式的算法
public static double wayOfLiLvJiSuan(double P, double N, double F) {
double i;
i = F / (P * N);
i = Math.round(i * 100) / 100.0;
return i;
}
//股票期限计算模式模式的算法
public static double wayOfGuPiaoQiXian(double F, double P, double i) {
double N;
N = (F - P) / (i * P);
N = Math.round(N * 100) / 100.0;
return N;
}
//本金计算模式的算法
public static double wayOfBenJinJiSuan(double i, double N, double F) {
double P;
P = F / (1 + i * N);
P = Math.round(P * 100) / 100.0;
return P;
}
//复利计算模式的算法
public static double wayOfFuLiJiSuan(double P, double i, double N) {
double F;
F = P * Math.pow((1 + i), N);
F = Math.round(F * 100) / 100.0;
return F;
}
//单利计算模式的算法
public static double wayOfDanLiJiSuan(double P,double i,double N){
double F;
F = P + P * i * N;
F = Math.round(F*100)/100.0;
return F;
}
}
测试类MoneyTest
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;
import org.junit.Before;
import org.junit.Test;
public class MoneyTest {
@Before
public void setUp() throws Exception {
}
@Test
public void testWayOfZiChanZongzhi() { // 测试资产总值算法
double f = Arithmetic.wayOfZiChanZongzhi(25000, 0.03, 4, 1350);
assertThat(f, is(32435.62));
}
@Test
public void testWayOfLiLvJiSuan() { // 测试利率计算算法
double f = Arithmetic.wayOfLiLvJiSuan(10000, 3, 13640);
assertThat(f, is(0.45));
}
@Test
public void testWayOfGuPiaoQiXian() { // 测试股票期限算法
double f = Arithmetic.wayOfGuPiaoQiXian(30000, 23000, 0.03);
assertThat(f, is(10.14));
}
@Test
public void testWayOfBenJinJiSuan() { // 测试本金计算算法
double f = Arithmetic.wayOfBenJinJiSuan(0.06, 4, 25000);
assertThat(f, is(20161.29));
}
@Test
public void testWayOfFuLiJiSuan() { // 测试复利计算算法
double f = Arithmetic.wayOfFuLiJiSuan(30000, 0.05, 3);
assertThat(f, is(34728.75));
}
@Test
public void testWayOfDanLiJiSuan() { // 测试单利计算算法
double f = Arithmetic.wayOfDanLiJiSuan(10000, 0.03, 1);
assertThat(f, is(10300.0));
}
}
测试采用的是org.junit.Assert中的assertThat()方法,该方法有两个参数,第一个是测试的方法计算出来的结果(即待测数据),第二个是预期结果(即逻辑上的正确结果),该方法将这两个参数进行比较,如果相同则为true,即该方法测试通过,如果不同则为false,即该方法测试失败。
以下为测试结果截图
六个方法测试全部通过。
在测试类中,方法的前面用@Test标注的表明这是一个测试方法。
用@Ignore标注的表明这是一个尚未完成的方法,不参与本次测试,这样测试结果就会提示该方法被忽略,而不是失败。
用@Before标注的表明这是每个测试执行之前都必须执行的代码,可以用来对共享数据进行清零,避免上一次的测试数据影响下一次的测试结果。
转载于:https://www.cnblogs.com/Leey0917/p/5330438.html