[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-spring-test-v-chyom-raznitsa-mezhdu-doreturn-when-i-when-thenreturn-v-mockito":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":15,"progress":16,"seo":17},696,"v-chyom-raznitsa-mezhdu-doreturn-when-i-when-thenreturn-v-mockito",16,"spring-test","Spring Test","🧪","В чём разница между doReturn\u002Fwhen и when\u002FthenReturn в Mockito?","Обе конструкции задают поведение мока, но имеют критические различия при работе со spy-объектами и void-методами.\n\n### when\u002FthenReturn — стандартный подход\n\nВызывает реальный метод при настройке мока (что может вызвать проблемы для spy-объектов):\n\n```java\nwhen(mock.someMethod()).thenReturn(\"результат\");\n```\n\n### doReturn\u002Fwhen — безопасный подход\n\nНе вызывает реальный метод при настройке:\n\n```java\ndoReturn(\"результат\").when(mock).someMethod();\n```\n\n### Ключевые различия\n\n**1. Spy-объекты:**\n\n```java\nList\u003CString> spyList = spy(new ArrayList\u003C>());\n\n\u002F\u002F Опасно! get(0) вызовется на пустом списке → IndexOutOfBoundsException\n\u002F\u002F when(spyList.get(0)).thenReturn(\"элемент\");\n\n\u002F\u002F Безопасно — реальный метод не вызывается при настройке\ndoReturn(\"элемент\").when(spyList).get(0);\n```\n\n**2. Void-методы:**\n\n```java\n\u002F\u002F Не скомпилируется:\n\u002F\u002F when(mock.voidMethod()).thenThrow(new RuntimeException());\n\n\u002F\u002F Правильно:\ndoThrow(new RuntimeException(\"ошибка\")).when(mock).voidMethod();\ndoNothing().when(mock).voidMethod();\n```\n\n**3. Цепочка вызовов:**\n\n```java\nwhen(mock.nextValue())\n    .thenReturn(\"первый\")\n    .thenReturn(\"второй\")\n    .thenThrow(new NoSuchElementException());\n```\n\n### Сводная таблица\n\n| Метод | Когда использовать |\n|---|---|\n| `when\u002FthenReturn` | Стандартный случай с моками |\n| `doReturn\u002Fwhen` | Spy-объекты, void-методы |\n| `doThrow\u002Fwhen` | Void-методы, которые должны бросить исключение |\n| `doAnswer\u002Fwhen` | Сложная логика, зависящая от аргументов |\n| `doNothing\u002Fwhen` | Подавление void-метода у spy |\n\n> **На собеседовании:** ключевой момент — объяснить, почему `when\u002FthenReturn` опасен для spy (реальный метод вызывается при настройке). Частая ошибка — не знать, что для void-методов `when\u002FthenReturn` не скомпилируется.","","middle",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":19,"keywords":20,"schemaAnswer":19,"featuredSnippetReady":21},"В чём разница между doReturn\u002Fwhen и when\u002FthenReturn в Mockit — Gymterview","Обе конструкции задают поведение мока, но имеют критические различия при работе со spy-объектами и void-методами.",[7,13],true]