NullpointerException при тестировании метода контроллера

Вот метод контроллера, который я собираюсь протестировать с помощью JUnit и JMock.

public String myMethod(ModelMap model, Principal principal,
                        @PathVariable MyObject obj) {
  if (obj != null) {
    Student student = getStudent(principal);
    if (check(obj, student)) {
      model.addAttribute(student).addAttribute(obj);
      return "page";
    }
  }
  return REDIR;
}


private boolean check(MyObject obj, Student student) {
  return student.getStudentNumber().longValue() == obj.getStudent().getStudentNumber().longValue();
}

Мой тест

final StudentService studentService = context.mock(StudentService.class);

public void test() throws Exception {
  ModelMap model = new ModelMap();
  final MyObject = new myObject();

  context.checking(new Expectations() {
    {
      oneOf(studentService).getByNumber(SecurityHelper.getStudentNumberOf(Helper.getTestPrincipal()));
      will(returnValue(mockStudent));
    }
  });

  controller.myMethod(model, Helper.getTestPrincipal(), obj);
}

При запуске теста я получаю NullPointerExeption, который указывает на метод проверки. Есть идеи, откуда это? Это потому, что мне не хватает каких-то ожиданий? Student и obj не являются интерфейсами, над которыми можно издеваться. Я новичок в этом. Как лучше всего отслеживать такие ошибки тестирования?


person mjgirl    schedule 29.11.2012    source источник
comment
Пожалуйста, опубликуйте свою трассировку стека. Кроме того, покажите код в своем тесте, где вы издеваетесь над studentService.   -  person Duncan Jones    schedule 29.11.2012
comment
Я добавил насмешку. Tracktrace указывает на номер строки в методе контроллера, где находится предложение if, и в тесте, где я вызываю метод controller.test-method   -  person mjgirl    schedule 29.11.2012
comment
Один из способов точного определения нулевого указателя — разделить оператор для использования временных переменных. То есть, когда у вас есть method1(methdo2()).method3()..., измените его на temp2 = method2(); temp1 = method1(temp2); temp1.method3()....   -  person hyde    schedule 29.11.2012
comment
Ни один из параметров, переданных методу проверки, не равен нулю.   -  person mjgirl    schedule 29.11.2012


Ответы (1)


Если я вас правильно понял, это строка, которая выдает исключение:

return student.getStudentNumber().longValue() == obj.getStudent()
    .getStudentNumber().longValue();

Таким образом, исключение может исходить из нескольких мест:

  1. studen или obj равны нулю.
  2. student.getStudentNumber() возвращает ноль.
  3. obj.getStudent() возвращает ноль
  4. obj.getStudent().getStudentNumber() возвращает ноль.

Сделайте System.out для всех этих операторов и посмотрите, какой из них имеет значение null.

person Tomer    schedule 29.11.2012