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

如何在JUnit测试类中为ReadFilePath类传递测试数据?

如何测试依赖Scanner输入的JUnit测试用例

作为JUnit新手,你遇到的核心问题是无法控制scanner.nextLine()的输入内容——默认情况下它读取的是系统标准输入,而测试需要完全可控的输入源。下面我会一步步教你解决这个问题:

第一步:改造父类,让Scanner可替换

你的ReadFilePath继承自CommandLineInput,首先需要让父类支持传入自定义的Scanner,这样测试时就能用模拟输入代替真实的系统输入。修改CommandLineInput类:

package input.commandline;
import java.util.Scanner;

public class CommandLineInput {
    protected Scanner scanner;

    // 保留原有的默认构造方法,供生产环境使用
    public CommandLineInput() {
        this.scanner = new Scanner(System.in);
    }

    // 添加一个测试专用的构造方法,允许传入自定义Scanner
    public CommandLineInput(Scanner scanner) {
        this.scanner = scanner;
    }
}

这里把scanner设为protected,子类就能直接访问;同时新增的构造方法让我们在测试时可以注入自己的Scanner实例。

第二步:编写测试用例

现在我们可以用ByteArrayInputStream模拟输入流,把测试用的路径字符串转换成输入流,再包装成Scanner传给ReadFilePath。

测试合法路径的场景

package input.commandline;
import org.junit.Test;
import java.io.ByteArrayInputStream;
import java.util.Scanner;
import static org.junit.Assert.assertEquals;

public class ReadFilePathTest {

    @Test
    public void testPerform_ValidPath_ReturnsCorrectPath() {
        // 1. 准备测试用的合法路径,注意要加换行符(模拟用户输入回车)
        String validTestPath = "C:\\MyFiles\\TestFile.txt";
        ByteArrayInputStream inputStream = new ByteArrayInputStream((validTestPath + "\n").getBytes());
        Scanner testScanner = new Scanner(inputStream);

        // 2. 创建ReadFilePath实例,传入测试用的Scanner
        ReadFilePath readFilePath = new ReadFilePath(testScanner);

        // 3. 执行方法并断言结果
        String result = readFilePath.perform();
        assertEquals(validTestPath, result);
    }
}

测试非法路径抛出异常的场景

当输入不符合正则表达式时,方法应该抛出InputMismatchException,我们可以用expected属性来验证这一点:

@Test(expected = InputMismatchException.class)
public void testPerform_InvalidPath_ThrowsException() {
    // 准备非法路径
    String invalidTestPath = "invalid/path/format";
    ByteArrayInputStream inputStream = new ByteArrayInputStream((invalidTestPath + "\n").getBytes());
    Scanner testScanner = new Scanner(inputStream);

    ReadFilePath readFilePath = new ReadFilePath(testScanner);
    // 执行方法,预期会抛出异常,测试通过
    readFilePath.perform();
}

小提示:检查你的正则表达式

顺便提一句,你当前的正则表达式([a-zA-Z]:)?(\\[a-zA-Z0-9_-]+)+\?可能存在问题——最后的\?会要求路径以问号结尾,这大概率不是你想要的效果。如果是匹配Windows路径,建议改成:

String regularExpression = "([a-zA-Z]:)?(\\\\[a-zA-Z0-9_-]+)+";

这样就能正确匹配类似C:\Folder\File或者\Folder\SubFolder这类路径了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 11:23:10