Java 如何通过jUnit测试内置扫描仪的方法?

Java 如何通过jUnit测试内置扫描仪的方法?,java,junit,junit5,Java,Junit,Junit5,以下是我的测试方法: @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");

以下是我的测试方法:

 @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));
}
@覆盖
公共HashMap findAllGroupsWithLessOrEqualsStudentCount(字符串路径数据库属性){
ConnectionFactory ConnectionFactory=新的ConnectionFactory();
扫描仪=新的扫描仪(System.in);
System.out.println(“请输入分组中的最小学生人数:”);
int numberOfStudents=scanner.nextInt();
System.out.println(main.drawGroupNames和numberOfStudents(main.replaceGroupNumberToGroupName(main.countNumberOfStudentsInGroups(numberOfStudents,pathToDatabaseProperties),connectionFactory.connectToDatabase(pathToDatabaseProperties));
返回main.replaceGroupNumberToGroupName(main.countNumberOfStudentsGroups(numberOfStudents,pathToDatabaseProperties),connectionFactory.connectToDatabase(pathToDatabaseProperties));
}
但我不知道如何用内置扫描仪测试方法

因为现在我运行测试,程序正在加载,什么也不做


所以,也许smb可以帮助您正确地编写测试。提前谢谢

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


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

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

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));
}

}
  • 对扫描仪进行方法初始化:
  • 公共课{

    @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));
    
    然后在类上使用@Spy并模拟此方法:

    @Spy
    private YourClass yourClass;
    @Mock
    private Scanner scanner;
    ...
    when(yourClass.getScanner()).thenReturn(scanner);
    when(scanner.nextInt()).thenReturn(number);
    

    您可以使用Powermockito模拟Scanner.java。类似问题:文档:
    public Scanner getScanner() {
           return new Scanner(System.in);
        }
    }
    
    @Spy
    private YourClass yourClass;
    @Mock
    private Scanner scanner;
    ...
    when(yourClass.getScanner()).thenReturn(scanner);
    when(scanner.nextInt()).thenReturn(number);