Как проверить метод со сканером внутри через jUnit? - PullRequest
0 голосов
/ 02 марта 2020

Вот мой метод тестирования:

 @Test
public void Should_Print_All_Groups_With_Less_Or_Equals_Student_Count() throws ClassNotFoundException, IOException, SQLException {

    SchoolDao schoolDao = new SchoolDaoImplementation();
    Class.forName("org.postgresql.Driver");

    assertEquals(schoolDao.findAllGroupsWithLessOrEqualsStudentCount("testDb.properties"), "check");

}
}

Вот метод, который я хочу проверить:

 @Override
public HashMap<String, Integer> findAllGroupsWithLessOrEqualsStudentCount(String pathToDatabaseProperties) {

    ConnectionFactory connectionFactory = new ConnectionFactory();

    Scanner scanner = new Scanner(System.in);
    System.out.println("Please, enter minimum number of students in groups : ");
    int numberOfStudents = scanner.nextInt();
    System.out.println(main.drawGroupNamesAndNumberOfStudents(main.replaceGroupNumberToGroupName(main.countNumberOfStudentsInGroups(numberOfStudents, pathToDatabaseProperties), connectionFactory.connectToDatabase(pathToDatabaseProperties))));
    return main.replaceGroupNumberToGroupName(main.countNumberOfStudentsInGroups(numberOfStudents, pathToDatabaseProperties), connectionFactory.connectToDatabase(pathToDatabaseProperties));
}

Но я не знаю, как я могу проверить метод со сканером внутри?

Потому что теперь я запускаю тест, и программа загружается и ничего не делает.

Так что, возможно, smb сможет помочь и правильно написать тест. Заранее спасибо!

Ответы [ 2 ]

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

С текущим решением вы не можете смоделировать сканер, потому что вы создаете новый экземпляр во время выполнения метода. Здесь могут быть два решения:

1.Сделать сканер в качестве поля класса:

public YourClass {
   private Scanner scanner = new Scanner(System.in);

@Override
public HashMap<String, Integer> findAllGroupsWithLessOrEqualsStudentCount(String pathToDatabaseProperties) {

    ConnectionFactory connectionFactory = new ConnectionFactory();

    System.out.println("Please, enter minimum number of students in groups : ");
    int numberOfStudents = scanner.nextInt();
    System.out.println(main.drawGroupNamesAndNumberOfStudents(main.replaceGroupNumberToGroupName(main.countNumberOfStudentsInGroups(numberOfStudents, pathToDatabaseProperties), connectionFactory.connectToDatabase(pathToDatabaseProperties))));
    return main.replaceGroupNumberToGroupName(main.countNumberOfStudentsInGroups(numberOfStudents, pathToDatabaseProperties), connectionFactory.connectToDatabase(pathToDatabaseProperties));
}

}

, а затем обычно издеваться над объектом сканера:

@Mock
private Scanner scanner;
...
MockitoAnnotations.initMocks(this);
when(scanner.nextInt()).thenReturn(number);
Выполните инициализацию метода Scanner:

publi c YourClass {

@Override
public HashMap<String, Integer> findAllGroupsWithLessOrEqualsStudentCount(String pathToDatabaseProperties) {

ConnectionFactory connectionFactory = new ConnectionFactory();

Scanner scanner = getScanner();
System.out.println("Please, enter minimum number of students in groups : ");
int numberOfStudents = scanner.nextInt();
System.out.println(main.drawGroupNamesAndNumberOfStudents(main.replaceGroupNumberToGroupName(main.countNumberOfStudentsInGroups(numberOfStudents, pathToDatabaseProperties), connectionFactory.connectToDatabase(pathToDatabaseProperties))));
return main.replaceGroupNumberToGroupName(main.countNumberOfStudentsInGroups(numberOfStudents, pathToDatabaseProperties), connectionFactory.connectToDatabase(pathToDatabaseProperties));

}

public Scanner getScanner() {
       return new Scanner(System.in);
    }
}

и затем используйте @Spy на вашем Класс и издеваться над этим методом:

@Spy
private YourClass yourClass;
@Mock
private Scanner scanner;
...
when(yourClass.getScanner()).thenReturn(scanner);
when(scanner.nextInt()).thenReturn(number);
0 голосов
/ 02 марта 2020

В идеале вы должны оставить пользовательский ввод отдельным методом . Помогает в обоих направлениях:

Это уменьшит избыточный код в будущем, и вы можете смоделировать этот метод ввода .

...