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