You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:15:32