Получение исключения нулевого указателя при использовании when().thenreturn() в mockito

#java #mockito

Вопрос:

Я пытаюсь заглушить этот метод: QueryUtils.Упорядочить(сортировать, корень, конструктор), и я делаю

 when(QueryUtils.toOrder(any(Sort.class), any(Root.class), any(CriteriaBuilder.class)).thenReturn(mock(List.class));
 

но он входит в тело метода queryUtils, и в нем будет указано, что сортировка равна нулю, и он выдаст NPE. Но зачем ему нужно входить в тело метода, если это заглушка? У меня раньше не было этой проблемы, и я не думаю, что это должно волновать, какова внутренняя логика метода.

Комментарии:

1. В ваших классах может быть больше вещей, чем в вашей базе данных, что приведет к их обнулению, или в вашем запросе могут быть некоторые вещи, которые можно обнулить, но они не могут быть обнулены в вашем классе, что приведет к ошибке.

2. Убедитесь, что вы позвонили в QueryUtils. Для заказа в коде используются те же типы, которые вы передали в тестовом коде.

3. @RenanFelipeFerreira Это не удается, когда он устанавливает when(…).thenreturn() в тесте на этапе упорядочения. Он получает исключение с нулевым указателем, а не при действии.

Ответ №1:

Проблема здесь в том, что Mockito не может использовать язык Java.

В when(mockedObject.mockedMethod()).thenReturn() форме выполняется метод mocked, и его возвращаемое значение передается в макет, где Mockito обменивает его на настроенное значение. Но издевательский объект инициализируется с null помощью s, поэтому любое свойство издевательского объекта, доступ к которому осуществляется в издевательском методе, вызывает NPE.

Чтобы прийти в себя, вы должны использовать скользящую менее читаемую форму doReturn().when(mockObject).mockedMethod() .
пожалуйста, обратите внимание, что закрытие ) перенесено!
В этой форме Mockito полностью предотвращает выполнение издевательского метода с помощью полиморфизма и напрямую возвращает настроенное значение.