package com.ankurm.restclienttest; import tools.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.restclient.test.autoconfigure.RestClientTest; import org.springframework.http.MediaType; import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.web.client.MockRestServiceServer; import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo; import static org.springframework.test.web.client.response.MockRestResponseCreators.withSuccess; /** * The core example: a {@code RestClient}-based client, tested with {@code @RestClientTest} and * {@code MockRestServiceServer}. {@link EmployeeClient} also depends on * {@link EmployeeAuditLogger}, a plain collaborator the REST-client slice never creates on its * own - replaced here with {@code @MockitoBean} now that {@code @MockBean} no longer exists in * Spring Boot 4. */ @RestClientTest(EmployeeClient.class) class RestClientEmployeeTest { @Autowired private MockRestServiceServer mockServer; @Autowired private EmployeeClient employeeClient; @Autowired private ObjectMapper objectMapper; @MockitoBean private EmployeeAuditLogger auditLogger; @Test void whenGetEmployeeById_thenReturnsEmployeeAndAudits() throws Exception { Employee mockEmployee = new Employee(1, "Ankur", "M", "ankur@example.com"); String employeeJson = objectMapper.writeValueAsString(mockEmployee); mockServer.expect(requestTo("http://hr-api.example.com/employees/1")) .andRespond(withSuccess(employeeJson, MediaType.APPLICATION_JSON)); Employee result = employeeClient.getEmployeeById(1); assertThat(result).isNotNull(); assertThat(result.id()).isEqualTo(1); assertThat(result.firstName()).isEqualTo("Ankur"); mockServer.verify(); Mockito.verify(auditLogger).logFetch(1); Capture.write("01-restclient-basic-fetch.txt", "RestClient-based EmployeeClient, real deserialized result and audit call", "requestTo(\"http://hr-api.example.com/employees/1\") -> 200 OK " + employeeJson + "\nresult = " + result + "\nauditLogger.logFetch(1) called = " + Mockito.mockingDetails(auditLogger) .getInvocations().stream().anyMatch(i -> i.getMethod().getName().equals("logFetch"))); } }