Mockito - заглушка метода объекта, который был возвращен методом фиктивного объекта - PullRequest
12 голосов
/ 29 октября 2011

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

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

, как обычно, но я ищу,

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

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

РЕДАКТИРОВАТЬ: На самом деле, возможно, что цепочка работает, но мои объекты вызывают 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);

Так в чем же причина проблемы?

1 Ответ

15 голосов
/ 29 октября 2011

Нет никаких проблем.

Давайте рассмотрим эти 4 строки кода:

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

Первая строка создает фиктивный indexManager.

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

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

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

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

...