[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-spring-test-chto-takoe-mockbean-i-spybean":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},694,"chto-takoe-mockbean-i-spybean",16,"spring-test","Spring Test","🧪","Что такое MockBean и SpyBean?","`@MockBean` и `@SpyBean` — аннотации Spring Boot Test, позволяющие подменять бины в контексте Spring моками и шпионами Mockito.\n\n### MockBean\n\n`@MockBean` заменяет бин в контексте полностью мок-объектом. Все методы по умолчанию возвращают `null` (или значение по умолчанию для примитивов). Полезно для изоляции тестируемого компонента от зависимостей:\n\n\u003Cdetails>\u003Csummary>Пример кода\u003C\u002Fsummary>\n\n```java\n@SpringBootTest\nclass OrderServiceTest {\n\n    @Autowired\n    private OrderService orderService;\n\n    @MockBean\n    private PaymentService paymentService;\n\n    @MockBean\n    private EmailService emailService;\n\n    @Test\n    void shouldCreateOrder() {\n        when(paymentService.processPayment(any()))\n            .thenReturn(new PaymentResult(true, \"txn-123\"));\n\n        Order order = orderService.createOrder(new OrderRequest(\"item-1\", 100));\n\n        assertNotNull(order);\n        verify(paymentService).processPayment(any());\n        verify(emailService).sendConfirmation(any());\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n### SpyBean\n\n`@SpyBean` оборачивает реальный бин из контекста шпионом Mockito. Реальные методы продолжают работать, но их можно перехватить и переопределить:\n\n\u003Cdetails>\u003Csummary>Пример кода\u003C\u002Fsummary>\n\n```java\n@SpringBootTest\nclass NotificationServiceTest {\n\n    @Autowired\n    private NotificationService notificationService;\n\n    @SpyBean\n    private AuditService auditService;\n\n    @Test\n    void shouldLogAuditEvent() {\n        notificationService.notifyUser(1L, \"Сообщение\");\n        verify(auditService).log(eq(1L), contains(\"Сообщение\"));\n    }\n\n    @Test\n    void shouldHandleAuditFailure() {\n        doThrow(new RuntimeException(\"Audit unavailable\"))\n            .when(auditService).log(anyLong(), anyString());\n\n        assertDoesNotThrow(\n            () -> notificationService.notifyUser(1L, \"Сообщение\")\n        );\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n### Важные нюансы\n\n- Начиная со Spring Boot 3.4 аннотации `@MockBean` и `@SpyBean` объявлены устаревшими (deprecated) в пользу `@MockitoBean` и `@MockitoSpyBean`, а также поддержки через `BeanOverride`. Однако они по-прежнему широко используются.\n- Каждая уникальная комбинация `@MockBean`\u002F`@SpyBean` создаёт отдельный кэш контекста. Чрезмерное использование разных мок-бинов в разных тестах приведёт к множественным пересозданиям контекста.\n\n> **На собеседовании:** интервьюер хочет услышать разницу между `@MockBean` (полная подмена) и `@SpyBean` (обёртка над реальным бином). Частая ошибка — не знать про влияние `@MockBean` на кэширование контекста.","","middle",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":20,"keywords":21,"schemaAnswer":19,"featuredSnippetReady":22},"Что такое MockBean и SpyBean? — Gymterview","`@MockBean` и `@SpyBean` — аннотации Spring Boot Test, позволяющие подменять бины в контексте Spring моками и шпионами Mockito.","`@MockBean` и `@SpyBean` — аннотации Spring Boot Test, позволяющие подменять бины в контексте Spring моками и шпионами M",[7,13],true]