Как провести модульное тестирование сканера, пожалуйста, помогите мне не получить его - PullRequest
0 голосов
/ 04 марта 2020

Я пока не очень хорош в программировании. Моя учебная задача состоит в модульном тестировании и программировании. Я получил каждый тест еще, но я действительно застрял в тестировании метода со сканером. Я знаю насмешки и все такое, но я не могу найти решение, как имитировать Inputstream или что-то вроде ByteArray. Если я всегда проверяю это, результат останавливает меня и ждет консоли, и поэтому тест не проходит. Вот код метода:

public String[] guess(){ //Eingabe vom Raten des ersten Versuchs in !!!STRINGS!!!
        int k = 1;
        Scanner valueIn = new Scanner(System.in);
        String[] guess = new String[4];
        for(int i = 0; i < 4;i++){
            k = 1;
            while(k==1) {
                System.out.println("now the " + (i + 1) + "color ");
                guess[i] = valueIn.nextLine();
                if(guess[i].equals("red")||guess[i].equals("blue")||guess[i].equals("yellow")||guess[i].equals("green")||guess[i].equals("purple")||guess[i].equals("brown")){
                    k = 0;
                }
            }
        }
        return guess;
    }

Может кто-нибудь, пожалуйста, помогите мне буквально плакать; (. Пожалуйста, полный результат или полное подробное решение

1 Ответ

0 голосов
/ 04 марта 2020

Используйте метод System.setIn ().

@Test
public void test(){
    String[] expectedOutputArray = {"red", "green", "yellow", "brown"};
    String input = "red\ngreen\nyellow\nbrown";
    InputStream in = new ByteArrayInputStream(input.getBytes());
    System.setIn(in);
    String[] outputArray = guess(); //call your guess function
    Assert.assertArrayEquals(expectedOutputArray, outputArray);
}
  • System.in - это, по сути, InputStream, который читает с консоли (отсюда и ваш ввод в консоли).
  • Поэтому подготовьте InputStream и задайте в свойстве класса System , используя System.setIn (in)

Я привожу другой подход к тому, как можно переформатировать код для тестирования метода угадайки, удалив зависимость от System.in

Пожалуйста, поместите каждый класс в отдельный java файл

public class GuessRefactor {
    private SystemClass systemObj;

    public String[] guess(SystemClass systemObj){
        int k = 1;
        String[] guess = new String[4];
        for(int i = 0; i < 4;i++){
            k = 1;
            while(k==1) {
                System.out.println("now the " + (i + 1) + "color ");
                guess[i] = systemObj.getInput();
                if(guess[i].equals("red")||guess[i].equals("blue")||guess[i].equals("yellow")||guess[i].equals("green")||guess[i].equals("purple")||guess[i].equals("brown")){
                    k = 0;
                }
            }
        }
        return guess;
    }

    public static void main(String[] args) {
        System.out.println(Arrays.toString(new GuessRefactor().guess(new SystemClass())));
    }
}


public class SystemClass {
    Scanner valueIn = new Scanner(System.in);

    public String getInput(){
        return valueIn.nextLine();
    }
}


@RunWith(MockitoJUnitRunner.class)
public class TestClass {
    @Mock
    SystemClass systemClass;

    @Test
    public void test(){
        GuessRefactor guessRefactor = new GuessRefactor();
        Mockito.when(systemClass.getInput()).thenReturn("red");
        String[] expectedOutput = {"red", "red", "red", "red",};
        String[] output = guessRefactor.guess(systemClass);
        Assert.assertArrayEquals(expectedOutput, output);
    }
}
...