如何在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
相关产品推荐
相关产品推荐

