Обнаружено исключение Mockito Null Pointer и незавершенная заглушка - PullRequest
0 голосов
/ 18 апреля 2020

Я пытаюсь выполнить модульное тестирование service с помощью entityManager

Сервисный код, который необходимо смоделировать:

Query query = entityManager.createNativeQuery(sqlQuery);

Object[] object = (Object[]) query.getSingleResult();

Тестовый код Mocking :

when(entityManagerMock.createNativeQuery(Mockito.anyString()).getSingleResult()).thenReturn(fixture);

Это приводит к исключению нулевого указателя

Однако, поскольку Mockito.anyString() возвращает пустую строку по умолчанию, createNativeQuery может не ожидать этого. Так что изменилось на ниже.

doReturn(fixture).when(entityManagerMock.createNativeQuery(Mockito.anyString()).getSingleResult());

, но с этим я получаю

org.mockito.exceptions.misusing.UnfinishedStubbingException: 
Unfinished stubbing detected here:
-> at com.novartis.idot.service.SrapiSapMeetingServiceTest.testFindById(SrapiSapMeetingServiceTest.java:112)

E.g. thenReturn() may be missing.
Examples of correct stubbing:
    when(mock.isOk()).thenReturn(true);
    when(mock.isOk()).thenThrow(exception);
    doThrow(exception).when(mock).someVoidMethod();
Hints:
 1. missing thenReturn()
 2. you are trying to stub a final method, which is not supported
 3: you are stubbing the behaviour of another mock inside before 'thenReturn' instruction if completed

Я ожидаю, что это связано с тем, что я звоню createNativeQuery внутри when, но потом я не могу издеваться query отдельно. Как мне издеваться?

Ответы [ 2 ]

1 голос
/ 18 апреля 2020

Пожалуйста, исправьте:

Query mockedQuery = mock(Query.class); //!
when(mockedQuery.getSingleResult()).thenReturn(fixture); //!! ;)
when(entityManagerMock.createNativeQuery(anyString())).thenReturn(mockedQuery);

Надеюсь, это объясняет, откуда происходят null и "Незаконченная заглушка". (вы должны смоделировать любой объект / вызов "между")


Это ^ относится только к "коду, который нужно смоделировать" и не предполагает никаких "других проблем" (например, entityMangerMock != null)

0 голосов
/ 18 апреля 2020

when (entityManagerMock.createNativeQuery (Mockito.anyString ()). GetSingleResult ()). ThenReturn (fixture);

если менеджер сущностей является ложным, то вы не можете пересечь несколько методов, потому что по умолчанию все методы для макета возвращают ноль, вы должны сделать это в два шага:

    Query queryMock = Mockito.mock(Query.class);    
 when(entityManagerMock.createNativeQuery(Mockito.anyString()).thenReturn(queryMock);
    when(queryMock.getSingleResult()).thenReturn(fixture);

Надеюсь, что это будет полезно!

...