[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-spring-test-kak-ispolzovat-testresttemplate-dlya-integratsionnykh-testov":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},703,"kak-ispolzovat-testresttemplate-dlya-integratsionnykh-testov",16,"spring-test","Spring Test","🧪","Как использовать TestRestTemplate для интеграционных тестов?","`TestRestTemplate` — обёртка над `RestTemplate`, предназначенная для интеграционных тестов с реальным HTTP-сервером. Работает только с `webEnvironment = RANDOM_PORT` или `DEFINED_PORT`.\n\n### Отличия от обычного RestTemplate\n\n- Автоматически настраивает базовый URL (включая порт)\n- Не бросает исключения при HTTP-ошибках (4xx, 5xx) — возвращает `ResponseEntity`\n- Поддерживает Basic-аутентификацию из коробки\n\n\u003Cdetails>\u003Csummary>Полный пример интеграционного теста\u003C\u002Fsummary>\n\n```java\n@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)\nclass UserControllerIntegrationTest {\n\n    @Autowired\n    private TestRestTemplate restTemplate;\n\n    @LocalServerPort\n    private int port;\n\n    @Test\n    void shouldGetAllUsers() {\n        ResponseEntity\u003CList\u003CUserDto>> response = restTemplate.exchange(\n            \"\u002Fapi\u002Fusers\",\n            HttpMethod.GET,\n            null,\n            new ParameterizedTypeReference\u003CList\u003CUserDto>>() {}\n        );\n\n        assertEquals(HttpStatus.OK, response.getStatusCode());\n        assertNotNull(response.getBody());\n    }\n\n    @Test\n    void shouldCreateUser() {\n        UserDto newUser = new UserDto(\"Иван\", \"ivan@example.com\");\n\n        ResponseEntity\u003CUserDto> response = restTemplate.postForEntity(\n            \"\u002Fapi\u002Fusers\",\n            newUser,\n            UserDto.class\n        );\n\n        assertEquals(HttpStatus.CREATED, response.getStatusCode());\n        assertNotNull(response.getBody().getId());\n    }\n\n    @Test\n    void shouldReturn404ForUnknownUser() {\n        ResponseEntity\u003CString> response = restTemplate.getForEntity(\n            \"\u002Fapi\u002Fusers\u002F999\",\n            String.class\n        );\n\n        \u002F\u002F TestRestTemplate не бросает исключение — возвращает ответ с кодом ошибки\n        assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode());\n    }\n\n    @Test\n    void shouldAccessProtectedEndpointWithAuth() {\n        TestRestTemplate authenticatedTemplate =\n            restTemplate.withBasicAuth(\"admin\", \"password\");\n\n        ResponseEntity\u003CString> response = authenticatedTemplate.getForEntity(\n            \"\u002Fapi\u002Fadmin\u002Fdashboard\",\n            String.class\n        );\n\n        assertEquals(HttpStatus.OK, response.getStatusCode());\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n> **На собеседовании:** ключевой момент — `TestRestTemplate` не бросает исключения на 4xx\u002F5xx, в отличие от `RestTemplate`. Частая ошибка — использовать `TestRestTemplate` с `webEnvironment = MOCK` (он не будет работать без реального сервера).","","middle",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":20,"keywords":21,"schemaAnswer":22,"featuredSnippetReady":23},"Как использовать TestRestTemplate для интеграционных тестов? — Gymterview","`TestRestTemplate` — обёртка над `RestTemplate`, предназначенная для интеграционных тестов с реальным HTTP-сервером. Работает только с `webEnvironment = RANDOM_","`TestRestTemplate` — обёртка над `RestTemplate`, предназначенная для интеграционных тестов с реальным HTTP-сервером. Раб",[7,13],"`TestRestTemplate` — обёртка над `RestTemplate`, предназначенная для интеграционных тестов с реальным HTTP-сервером. Работает только с `webEnvironment = RANDOM_PORT` или `DEFINED_PORT`.",true]