2016-04-06 4 views
0

Согласно THIS сообщению, Есть два способа Mock метод doSomeStuff() для возврата 1:Spying с Mockito

when(bloMock.doSomeStuff()).thenReturn(1); 

и

doReturn(1).when(bloMock).doSomeStuff(); 

В очень важное различие состоит в том, что первый вариант будет фактически вызовет doSomeStuff() - метод, в то время как второй не будет

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

+2

Возможный дубликат: http://stackoverflow.com/questions/20353846/mockito-difference-between-doreturn-and-when – troig

+1

На самом деле я внимательно прочитал ваш вопрос. Тем не менее, я никогда не слышал до того различия, которое вы назначили (и я только заметил, что это описано в одном из ответов на мой связанный вопрос). Во всяком случае, я буду ждать ответов. Спасибо за комментарий :) – troig

+2

Также подумайте, что это дубликат, на ваш вопрос «какой смысл иметь первый вариант» отвечает принятый ответ: «Одна вещь, которая когда/thenReturn дает вам, что doReturn/when does not, является проверкой типа возвращаемого значения во время компиляции. ' – Bewusstsein

ответ

1

Я выкопал немного больше, чем это, и ответ на вопрос, почему оба синтаксиса существуют, можно найти в старом release notes и ссылочном mailing list discussion.

Во-первых, в версии 1.5 (26/07/2008) добавлен doReturn(), а в версии 1.6 (21/10/2008) добавлен when(). when() был использован для замены старого метода stub() и doReturn() для замены stubVoid(). В основном это дизайн deicision создателем Mockito (цит из списка рассылки 29/06/2008):

Я никогда не любил stubVoid синтаксис(), но это было лучшее, что я мог думать о. Синтаксис раскорчевки Я бы реализовать сейчас, если я Mockito снова сделал:

// регулярная раскорчевка:

when(mock.getStuff()).thenReturn("foo");
when(mock.getStuff()).thenThrow(new RuntimeException());

// для пустых методов и некоторых угловых случаев:

doReturn("foo").when(mock).getStuff();
doThrow(new RuntimeException()).when(mock).someMethod();

// для гася последовательно:

when(mock.getStuff()).thenReturn("foo").thenThrow(new RuntimeException());
doThrow(new RuntimeException()).thenReturn("foo").when(mock).someMethod();

Я предложил этот синтаксис пару недель назад, но получил только одного обратную связь о том, что это скорее косметическая (это правда ...). Следовательно, I решил не изменять API.

И как уже указывал Bewusstsein в комментариях, when() обеспечивает безопасность типа. Если у нас есть метод String doSomething(), то оба подблока будут скомпилированы. Тем не менее последнее будет выдавать исключение во время выполнения.

Mockito.doReturn("String").when(mock).doSomething(); 
Mockito.doReturn(1).when(mock).doSomething(); 

Итак, в заключение, было конструктивным решением ввести оба способа насмешки. when() был выбран как предпочтительный способ издеваться над своим типом безопасности и плавным чтением. doReturn() был выполнен с целью издеваться над методами void и другими угловыми корпусами.

Смежные вопросы