如何从Java主方法测试程序?新手如何高效测试Calculator类方法
最高效的Calculator类测试方式(针对Java新手)
嘿,作为Java新手,你当前的代码把计算核心逻辑和控制台用户交互硬绑在一起了——构造方法里的死循环加Scanner输入,导致你每次测试都得手动敲数字选功能,效率极低。最靠谱也最高效的方式,是先重构代码解耦逻辑,再用**单元测试框架(比如JUnit)**做自动化测试,下面一步步给你讲:
第一步:重构Calculator类,拆分逻辑
首先得把加减乘除这些计算方法从交互循环里抽出来,让它们变成独立的、只负责计算的方法,和输入输出完全分离。这样我们才能单独测试这些方法,不用每次都跑一遍交互流程。
重构后的代码示例:
package BeginnerLevel; import java.util.Scanner; public class Calculator { // 加法方法:只负责计算,接收两个参数返回结果 public double add(double num1, double num2) { return num1 + num2; } // 减法方法 public double subtract(double num1, double num2) { return num1 - num2; } // 乘法方法 public double multiply(double num1, double num2) { return num1 * num2; } // 除法方法:额外处理除数为0的异常 public double divide(double num1, double num2) { if (num2 == 0) { throw new IllegalArgumentException("除数不能为0哦"); } return num1 / num2; } // 把原来的用户交互逻辑移到main方法里,作为程序入口 public static void main(String[] args) { Calculator calculator = new Calculator(); Scanner input = new Scanner(System.in); while (true) { System.out.println("Personal Calculator\n" + "Addition---> 1 \n" + "Subtraction---> 2\n" + "Multiplication---> 3\n" + "Division---> 4\n" + "Exit--->0"); int UsrIn = input.nextInt(); if (UsrIn == 0) { System.out.println("拜拜啦~"); break; } System.out.println("请输入第一个数字:"); double num1 = input.nextDouble(); System.out.println("请输入第二个数字:"); double num2 = input.nextDouble(); try { double result = switch (UsrIn) { case 1 -> calculator.add(num1, num2); case 2 -> calculator.subtract(num1, num2); case 3 -> calculator.multiply(num1, num2); case 4 -> calculator.divide(num1, num2); default -> throw new IllegalArgumentException("无效选项,请重新选择"); }; System.out.println("计算结果:" + result); } catch (IllegalArgumentException e) { System.out.println("出错啦:" + e.getMessage()); } } input.close(); } }
第二步:用JUnit写自动化单元测试
JUnit是Java生态里最常用的单元测试工具,能帮你一键运行所有测试用例,不用手动输入。你需要先把JUnit依赖加到项目里(如果用IDEA/Eclipse的话,创建测试类时会自动提示添加)。
然后写一个测试类CalculatorTest,针对每个计算方法写测试用例:
package BeginnerLevel; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; class CalculatorTest { // 实例化要测试的Calculator对象 private final Calculator calculator = new Calculator(); // 测试加法:覆盖正数、负数、零的情况 @Test void testAdd() { assertEquals(5, calculator.add(2, 3)); // 2+3=5 assertEquals(-1, calculator.add(2, -3)); // 2+(-3)=-1 assertEquals(0, calculator.add(0, 0)); // 0+0=0 } // 测试减法 @Test void testSubtract() { assertEquals(1, calculator.subtract(3, 2)); // 3-2=1 assertEquals(5, calculator.subtract(2, -3)); // 2-(-3)=5 assertEquals(0, calculator.subtract(5, 5)); // 5-5=0 } // 测试乘法 @Test void testMultiply() { assertEquals(6, calculator.multiply(2, 3)); // 2*3=6 assertEquals(-6, calculator.multiply(2, -3)); // 2*(-3)=-6 assertEquals(0, calculator.multiply(0, 5)); // 0*5=0 } // 测试除法:包括正常情况和除数为0的异常场景 @Test void testDivide() { assertEquals(2, calculator.divide(6, 3)); // 6/3=2 assertEquals(-2, calculator.divide(6, -3)); // 6/(-3)=-2 assertEquals(0.5, calculator.divide(1, 2)); // 1/2=0.5 // 验证除数为0时会抛出预期异常 assertThrows(IllegalArgumentException.class, () -> calculator.divide(5, 0)); } }
为什么这是最高效的?
- 自动化运行:写完测试后,每次修改代码都能一键运行所有用例,不用反复手动输入数字选功能,节省大量时间。
- 覆盖全面:轻松测试各种边界情况(比如负数、零、除数为0),手动测试很容易漏掉这些场景。
- 快速定位问题:如果某个测试失败,JUnit会直接告诉你哪个方法、哪个用例出了问题,不用自己慢慢排查。
内容的提问来源于stack exchange,提问作者Klayd Pro
相关产品推荐
相关产品推荐

