Использование Junit для имитации ввода пользователя в объект Scanner

Я очень новичок в JUnit и модульном тестировании и у меня есть вопрос, касающийся насмешливого пользовательского ввода в объект Scanner. У меня есть следующий код, который я хотел бы проверить. Очень простой

Выполнить код

import java.util.Scanner;

public class MyGame{
    public MyGame() {
        Scanner response = new Scanner(System.in);

        int game;

        System.out.println("Enter a game.");
        System.out.println("Press 1 for Super Awesome Bros.");
        System.out.println("Press 2 for a Random game.");

        game = response.nextInt();

        if (game == 1){
            System.out.println("Super Awesome Bros.");
    }
  }
}

Вот мой тестовый пример

import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.junit.contrib.java.lang.system.StandardOutputStreamLog;
import org.junit.contrib.java.lang.system.TextFromStandardInputStream;
import static org.junit.Assert.assertThat;
import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.contrib.java.lang.system.TextFromStandardInputStream.*;

@RunWith(JUnit4.class)
    public class Testsuite {

      @Rule
      public final StandardOutputStreamLog out = new StandardOutputStreamLog();

      @Rule
      public final TextFromStandardInputStream in = emptyStandardInputStream();

  @Test
  public void printOutput() {
    in.provideText("1\n");
    new MyGame();
    assertThat(out.getLog(), containsString("Super Awesome Bros."));
  }

}

Поэтому в моем Testcase я пытаюсь смоделировать ввод, чтобы быть 1, чтобы я мог получить ожидаемый результат. Но по какой-то причине мой код проходит независимо от того, что вывод. Я не уверен, что я делаю неправильно. Тест должен провалиться, если результат не соответствует ожидаемому. Может кто-то определить проблему? Опять же, я просто пытаюсь понять JUnit и модульное тестирование. Я использую в основном тестирование на Python. Спасибо всем в продвинутом.

1 ответ

Ваш тест всегда проходит, потому что вы всегда пишете строку "Нажмите 1 для Super Awesome Bros.". Поэтому проверка

assertThat(out.getLog(), containsString("Super Awesome Bros."));

совпадает всегда.

Кстати, вам не нужно писать @RunWith(JUnit4.class), Вы можете удалить эту строку.

Другие вопросы по тегам