@Test
  public void testImportStudents() throws Exception {

    // Given
    StudentDirectoryServiceImpl studentDirectoryService = new StudentDirectoryServiceImpl();

    StudentDAO studentDAO = mock(StudentDAO.class);
    studentDirectoryService.setStudentDAO(studentDAO);

    MultipartFile multipartFile = mock(MultipartFile.class);

    StringBuffer buffer = new StringBuffer();
    buffer.append("Bart, Simpson\n");
    buffer.append("Lisa, Simpson");
    InputStream stream =
        new ByteArrayInputStream(buffer.toString().getBytes(StandardCharsets.UTF_8));
    when(multipartFile.getInputStream()).thenReturn(stream);

    // When
    studentDirectoryService.importStudents(multipartFile);

    // Then
    ArgumentCaptor<Student> studentCaptor = ArgumentCaptor.forClass(Student.class);
    verify(studentDAO, times(2)).createStudent(studentCaptor.capture());

    assertEquals("Bart", studentCaptor.getAllValues().get(0).getFirstName());
    assertEquals("Simpson", studentCaptor.getAllValues().get(0).getLastName());

    assertEquals("Lisa", studentCaptor.getAllValues().get(1).getFirstName());
    assertEquals("Simpson", studentCaptor.getAllValues().get(1).getLastName());
  }
  @Test
  public void testImportStudents_exception() throws Exception {

    // Given
    StudentDirectoryServiceImpl studentDirectoryService = new StudentDirectoryServiceImpl();

    Logger logger = mock(Logger.class);
    studentDirectoryService.setLogger(logger);

    StudentDAO studentDAO = mock(StudentDAO.class);
    studentDirectoryService.setStudentDAO(studentDAO);

    MultipartFile multipartFile = mock(MultipartFile.class);

    IOException exception = new IOException("This is a dummy IOException.");
    when(multipartFile.getInputStream()).thenThrow(exception);

    // When
    studentDirectoryService.importStudents(multipartFile);

    // Then
    ArgumentCaptor<String> errorCaptor = ArgumentCaptor.forClass(String.class);
    verify(logger, times(1)).error(errorCaptor.capture());

    assertEquals(exception, errorCaptor.getValue());
  }
  @Test
  public void testFetchAllStudents_happypath() {

    // Given
    StudentDirectoryServiceImpl studentDirectoryService = new StudentDirectoryServiceImpl();

    StudentDAO studentDAO = mock(StudentDAO.class);
    studentDirectoryService.setStudentDAO(studentDAO);

    List<Student> testStudents = new ArrayList<Student>();

    Student testStudent1 = new Student();
    testStudent1.setFirstName("Michael");
    testStudent1.setLastName("Bluth");
    testStudents.add(testStudent1);

    Student testStudent2 = new Student();
    testStudent2.setFirstName("Lindsay");
    testStudent2.setLastName("Bluth");
    testStudents.add(testStudent2);

    when(studentDAO.fetchAllStudents()).thenReturn(testStudents);

    // When
    List<Student> students = studentDirectoryService.fetchAllStudents();

    // Then
    assertNotNull(students);
    assertEquals(2, students.size());
    assertEquals("Michael", students.get(0).getFirstName());
    assertEquals("Lindsay", students.get(1).getFirstName());
  }
  @Test
  public void testUpdateStudent_passnull() {

    // Given
    StudentDirectoryServiceImpl studentDirectoryService = new StudentDirectoryServiceImpl();

    try {
      // When
      studentDirectoryService.updateStudent(null);
      fail("An exception should have been thrown for a null value passed as a parameter.");
    } catch (Exception e) {
      // Then
      assertTrue(e instanceof NullPointerException);
      assertEquals("Unable to update a student. The student cannot be null.", e.getMessage());
    }
  }
  @Test
  public void testUpdateStudent_happypath() {

    // Given
    StudentDirectoryServiceImpl studentDirectoryService = new StudentDirectoryServiceImpl();

    StudentDAO studentDAO = mock(StudentDAO.class);
    studentDirectoryService.setStudentDAO(studentDAO);

    Student testStudent = new Student();
    testStudent.setFirstName("Michael");
    testStudent.setLastName("Bluth");

    // When
    studentDirectoryService.updateStudent(testStudent);

    // Then
    ArgumentCaptor<Student> studentCaptor = ArgumentCaptor.forClass(Student.class);
    verify(studentDAO, times(1)).updateStudent(studentCaptor.capture());

    assertEquals("Michael", studentCaptor.getValue().getFirstName());
    assertEquals("Bluth", studentCaptor.getValue().getLastName());
  }