Подтвердить что ты не робот

Mockito - Stubbing метод объекта, который был возвращен методом макета объекта

Скажем, у меня есть макет объекта, и я не хочу заглушить его, но я хочу заглушить метод возвращаемого им объекта. Например,

when(mockObject.method1()).thenReturn(returnValue)

как обычно это делается, но я ищу,

when(mockObject.method1().method2()).thenReturn(returnValue)

Это возможно? Я получаю исключение NullPointerException, если я это сделаю. В настоящее время я закрыл первый метод, чтобы вернуть объект-макет, а затем используя этот возвращенный макет объекта, заглушите второй метод. Однако эти временные макетные объекты бесполезны для меня и после объединения многих методов вместе, что приводит к множеству бесполезных макетных объектов.

EDIT: На самом деле возможно, что цепочка работает, но мои объекты вызывают NPE. Этот код (первая строка) вызывает NPE:

when(graphDb.index().getNodeAutoIndexer()).thenReturn(nodeAutoIndexer);
when(graphDb.index().getRelationshipAutoIndexer()).thenReturn(relAutoIndexer);

Но этот код работает:

IndexManager indexManager = mock(IndexManager.class);
when(graphDb.index()).thenReturn(indexManager);
when(indexManager.getNodeAutoIndexer()).thenReturn(nodeAutoIndexer);
when(graphDb.index().getRelationshipAutoIndexer()).thenReturn(relAutoIndexer);

Таким образом, цепочка не работает для getNodeAutoIndexer(), которая возвращает объект AutoIndexer, когда он работал для getRelationshipAutoIndexer(), который возвращает RelationshipAutoIndexer. Оба возвращаемых значения высмеиваются следующим образом:

nodeAutoIndexer = (AutoIndexer<Node>) mock(AutoIndexer.class);
relAutoIndexer = mock(RelationshipAutoIndexer.class);

И что может быть причиной проблемы?

4b9b3361

Ответ 1

Нет проблем.

Рассмотрим эти 4 строки кода:

IndexManager indexManager = mock(IndexManager.class);
when(graphDb.index()).thenReturn(indexManager);
when(indexManager.getNodeAutoIndexer()).thenReturn(nodeAutoIndexer);
when(graphDb.index().getRelationshipAutoIndexer()).thenReturn(relAutoIndexer);

Первая строка создает макет indexManager.

Второй говорит, что mock graphDb возвращает indexManager (макет, созданный в первой строке) при вызове метода index.

Третий телет mock indexManager (созданный в первой строке) для возврата nodeAutoIndexer, когда вызывается метод getNodeAutoIndexer.

И последняя строка вызывает graphDb.index(), которая возвращает mock indexManager (вы сказали ему сделать это во второй строке) и запрашивает этот indexManager (который является макетом, который вы создали в первой строке), чтобы вернуть relAutoIndexer, когда вызывается метод getRelationshipAutoIndexer.

Последняя строка работает только потому, что вы сказали mock graphDb, что нужно вернуть при вызове метода index. Если вы этого еще не сделали, метод mock graphDb.index() вернул бы null, и у вас был бы NPE.