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

