在测试以下方法时如何忽略sysout语句?
public int inputBoardSize() {
System.out.print("Enter the number of grids you want to play with:");
while (flag) {
try {
boardSize = validateBoardSize(Integer.parseInt(scan.nextLine()));
} catch (NumberFormatException e) {
System.err.println("Please enter a number");
}
}
printBoard(boardSize);
return boardSize;
}
所以当我测试这个方法时,我得到一个提示,要求我输入网格数。我该如何解决这个问题?
答案 0 :(得分:1)
您需要模拟资源。因此,创建一个像
这样的包装界面public interface LineProvider {
String nextLine();
}
并实现类,首先是您将在实际程序中使用的类:
public class UserInput implements LineProvider {
private Scanner mScanner;
public UserInput(Scanner scanner) {
mScanner = scanner;
}
@Override
public String nextLine() {
return mScanner.nextLine();
}
}
然后你将用于测试的模拟:
public class UserInputMock implements LineProvider {
private String mLineToReturn;
public UserInputMock(String initialLine) {
mLineToReturn = initialLine;
}
public void setLineToReturn(String lineToReturn) {
mLineToReturn = lineToReturn;
}
@Override
public String nextLine() {
return mLineToReturn;
}
}
现在让您的方法接受资源作为参数:
public int inputBoardSize(LineProvider provider) {
...
boardSize = validateBoardSize(Integer.parseInt(provider.nextLine()));
...
}
在您的主程序中,您使用UserInput
之类的
UserInput userInput = new UserInput(scan);
...
inputBoardSize(userInput);
而在你的测试中你使用模拟:
UserInputMock mock = new UserInputMock("hello world");
inputBoardSize(mock); // Not valid
mock.setLineToReturn("5");
inputBoardSize(mock); // Valid
请注意,有一些框架可以让这样的东西更容易。