您不应该在单元测试System.in
期间搞乱。
问问自己你正在测试什么。您是在测试Scanner
代码,还是使用用户输入的任何值的代码?
您的代码可能会做 3 件事:
在单元测试中,您正在测试操作,而不是用户提示或显示逻辑。或者如果你这样做,它们应该是 3 个不同的单元测试,并且记住,如果你正在测试用户提示,你正在测试 的使用,而Scanner
不是 Scanner 是否可以读取System.in
。
因此,首先将您的代码拆分为:
public class MyClass {
public static void main(String[] args) {
Input input = promptUserForInput(new Scanner(System.in), System.out);
Result result = performOperation(input);
printResult(System.out, result);
}
// methods here
}
如果它们是简单值Input
,则不必创建新类。Result
它们也可以是同一个类,例如MyClass
.
这样您就可以测试该操作是否适用于各种输入,这是您最关心的问题。
@Test
public void testOperation1() {
Input input = new Input(5, 15, true); // true means subtract
Result result = MyClass.performOperation(input);
assertEquals(-10, result.getValue());
}
@Test
public void testOperation2() {
Input input = new Input(5, 15, false); // false means add
Result result = MyClass.performOperation(input);
assertEquals(20, result.getValue());
}
如果需要,您还可以测试用户提示和结果打印。
@Test
public void testPrompt() {
String userInput = "5 15\nYes";
PrintStream out = new PrintStream(new ByteArrayOutputStream());
Input input = MyClass.promptUserForInput(new Scanner(userInput), out);
assertEquals(5, input.getNum1());
assertEquals(15, input.getNum2());
assertTrue(input.isSubtractRequested());
}
@Test
public void testPrint() {
ByteArrayOutputStream buf = new ByteArrayOutputStream();
try (PrintStream out = new PrintStream(buf)) {
MyClass.printResult(out, new Result(-10));
}
String outText = new String(buf.toByteArray());
assertEquals("Result is -10\r\n", outText);
}