如何通过jUnit内部扫描仪测试方法



这里是我的测试方法:

@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可以提供帮助并编写正确的测试。提前感谢!

理想情况下,您应该将用户输入作为一个单独的方法。双向帮助;

它将在未来减少冗余代码,并且您可以模拟该输入方法

使用当前的解决方案,您无法模拟Scanner,因为您在执行方法时正在创建新实例。这里可能有两种解决方案:

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);
  1. 对扫描仪进行方法初始化:

公共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);

最新更新