Search code examples
javaunit-testingnullpointerexceptionjmockit

NullPointerException when mocking controller class


i wanted to write some tests for the method shown in the code below. I'm mocking dependencies with JMockit. For whatever reason i am getting a NullPointerException all the time and i really don't understand why that happens. I'm new to JMockit and in mocking dependencies in general. Stack Trace just shows NullPointerException thrown at line new NonStrictExpectations() .

Method to test:

@Override
public boolean addSubject(User user, Schedule schedule, SchoolSubject subject) {
    final boolean result = schedule.addSubject(subject.getHourTime(), subject);
    scheduleDAO.update(schedule);
    if (subject.getTeacher() != null && !subject.getTeacher().trim().isEmpty()) {
        for (final TeacherEntry teacher : user.getTeachers()) {
            if (subject.getTeacher().equals(teacher.getName())) {
                teacher.getSubjects().add(subject.getName());
                teacherDAO.update(teacher);
            }
        }
    }
    try {
        userDAO.update(user);
    } catch (final DuplicateUniqueFieldException e) {
        throw new UnexpectedUniqueViolationException(e);
    }
}

Test method:

//imports not copied
public class ScheduleManagerTest {

@Tested
ScheduleManager manager;

@Injectable
UserDAO userDAO;

@Injectable
ScheduleDAO scheduleDAO;

@Injectable
TeacherEntryDAO teacherDAO;

@Injectable
SchoolSubjectDAO schoolSubjectDAO;

@Mocked
Schedule schedule;

@Mocked
SchoolSubject subject;

@Mocked
User user;

@Test
public void testAddSubject() throws DuplicateUsernameException, DuplicateEmailException {

    new NonStrictExpectations() {

        {
            schedule.addSubject(anyInt, (SchoolSubject) any);
            result = true;
            scheduleDAO.update((Schedule) any);
            subject.getTeacher();
            result = anyString;
            subject.getTeacher().trim().isEmpty();
            result = false;
            user.getTeachers();
            result = (ArrayList<TeacherEntry>) any;
            teacherDAO.update(((TeacherEntry) any));
            userDAO.update((User) any);
        };
    };

    assertTrue(manager.addSubject(user, schedule, subject));

    }
}

I think i'm doing something pretty wrong :(


Solution

  • It's hard to know what is going wrong based on the description, but here's a guess:

    Mocked objects will return null in their methods by default. You'll get a null pointer here:

    subject.getTeacher().trim()
    

    because getTeacher() will return null. To return a teacher, you'll have to either use a real subject or do further mocking with

    Mockito.when(subject.getTeacher()).thenReturn(new Teacher());