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

Java测试含Scanner输入的dateValidation方法报错,求正确测试方案

正确测试dateValidation方法的方式

原方法代码

private static int dateValidation(Scanner sc)
{
    int date;

    do
    {
        
        System.out.println("Please enter date of birth in numbers:");
        date = sc.nextInt();
        sc.nextLine();

        if (date < 1 || date > 31)
        {
            System.out.println("Error. Please enter an appropriate date between 1-31 inclusive.");
        }
        
    } while (date < 1 || date > 31);

    return date;
}

错误根源

你之前的测试方式不符合方法的参数要求:

  • 方法必须接收Scanner类型参数,无参调用、传字符串、传System.setIn()的返回值(void类型)都不匹配参数类型,因此触发报错。

正确测试代码

核心逻辑是创建绑定模拟输入流的Scanner实例,再将其传入目标方法,示例如下:

import java.io.ByteArrayInputStream;
import java.util.Scanner;
import static org.junit.Assert.assertEquals;

public class ProgramTest {
    public static void dateValidationTest() {
        // 模拟合法输入内容
        String inputTest = "10";
        // 用输入字符串构建字节流
        ByteArrayInputStream inputStream = new ByteArrayInputStream(inputTest.getBytes());
        // 创建使用该字节流的Scanner对象
        Scanner mockScanner = new Scanner(inputStream);
        
        // 传入Scanner调用目标方法
        int result = Program.dateValidation(mockScanner);
        // 断言结果符合预期
        assertEquals(10, result);
    }
}

测试非法输入场景

如果要验证方法对非法输入的处理逻辑(比如先输入32,再输入合法的15),可以编写如下测试:

public static void dateValidationInvalidInputTest() {
    // 模拟先输入非法值,再输入合法值
    String inputTest = "32\n15";
    ByteArrayInputStream inputStream = new ByteArrayInputStream(inputTest.getBytes());
    Scanner mockScanner = new Scanner(inputStream);
    
    int result = Program.dateValidation(mockScanner);
    // 断言最终返回合法的输入值
    assertEquals(15, result);
}

内容的提问来源于stack exchange,提问作者natadecoco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 17:16:07