Junit test Проблема со входом сканера - PullRequest
0 голосов
/ 08 марта 2019

В настоящее время я пытаюсь протестировать игру для задания Uni. Ниже приведен пример методов, которые я пытаюсь проверить.

public static int choosePlayers(int num) {
    while (validPlayerNumber == false) {
        try {
            System.out.print("Please enter Number of players (2-4)\n> ");
            num = in.nextInt();
            switch (num) {
            case 2:
                validPlayerNumber = true;
                numberPlayers = num;
                System.out.println(numberPlayers + " players selected");
                break;
            case 3:
                validPlayerNumber = true;
                numberPlayers = num;
                System.out.println(numberPlayers + " players selected");
                break;
            case 4:
                validPlayerNumber = true;
                numberPlayers = num;
                System.out.println(numberPlayers + " players selected");
                break;
            default:
                throw new IllegalArgumentException("Sorry, that is not a valid selection.");
                // System.out.println("Sorry, that is not a valid selection.");
            }
        } catch (InputMismatchException ex) {
            // log the exception
            System.out.println("Problem with input : " + ex.toString());
            continue;
        }
    }
    return numberPlayers;
}

Я использую следующий тестовый класс для проверки этого:

/**
 * @throws java.lang.Exception
 */
@Before

public void setUp() throws Exception {
    num1 =1;
    num2= 2;
    num4 = 4;
    num3 = 3;
    num5 = 5;
    game= new Game();
}

@Test
public void testchoosePlayers2() {

 System.out.println("Testing choosingPlayers 2");
Scanner scanner = new Scanner (System.in);
 int expected = scanner.nextInt();
  int actual = game.choosePlayers(num2);
 assertEquals(expected, actual);
 System.out.println("Test finsihed");
}


@Test
public void testchoosePlayers3() {
    System.out.println("Testing choosingPlayers 3");
    Scanner scanner = new Scanner (System.in);
    int expected = scanner.nextInt();
    int actual = game.choosePlayers(num3);
     assertEquals(expected, actual);
     System.out.println("Test finsihed");

}


@Test
public void testchoosePlayers4() {
    System.out.println("Testing choosingPlayers 4");
    Scanner scanner = new Scanner (System.in);
    int expected = scanner.nextInt();
    int actual = game.choosePlayers(num4);
     assertEquals(expected, actual);
     System.out.println("Test finsihed");

}

Каждый раз, когда я пытаюсь запустить этот тест, запускается только первый тест, и сканер не запрашивается повторно для последующих 2. Есть ли способ обойти это? Я был бы очень признателен за любые советы по этому вопросу или за лучший / более эффективный способ тестирования вышеуказанного метода.

1 Ответ

1 голос
/ 08 марта 2019

Ваша цель здесь состоит в том, чтобы проверить, что метод возвращает правильные значения с предоставленными входными параметрами. Если вы сканируете неверное значение, проверка не удастся. Таким образом, вместо сканирования ожидаемого значения просто поместите ожидаемое значение в утверждение. Также вам не нужны отдельные тесты, так как вы тестируете ту же функциональность.

Для имитации ввода вам нужно заменить System.in вашим собственным потоком ввода. См. JUnit: как смоделировать тестирование System.in? для деталей.


    private final InputStream systemIn = System.in;
    private ByteArrayInputStream testIn;

    @After
    public void resetSystemIn() {
        System.setIn(systemIn);
    }

    private void inputData(String data) {
        testIn = new ByteArrayInputStream(data.getBytes());
        System.setIn(testIn);
    }

    @Test
    public void testchoosePlayers() {
        System.out.println("Testing choosingPlayers 2");
        inputData("2");
        int actual = game.choosePlayers(num2);
        assertEquals(num2, actual);
        System.out.println("Testing choosingPlayers 3");
        inputData("3");
        actual = game.choosePlayers(num3);
        assertEquals(num3, actual);
        System.out.println("Testing choosingPlayers 4");
        inputData("4");
        actual = game.choosePlayers(num4);
        assertEquals(num4, actual);
        System.out.println("Test finsihed");
    }
...