测试junit时忽略扫描仪输入

时间:2018-04-15 15:55:38

标签: java junit

在测试以下方法时如何忽略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;
}

所以当我测试这个方法时,我得到一个提示,要求我输入网格数。我该如何解决这个问题?

1 个答案:

答案 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

请注意,有一些框架可以让这样的东西更容易。