Files
spring-boot-demo/rest-client-test/src/test/java/com/ankurm/restclienttest/HttpInterfaceClientTest.java
T

55 lines
2.3 KiB
Java

package com.ankurm.restclienttest;
import tools.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.restclient.test.autoconfigure.RestClientTest;
import org.springframework.http.MediaType;
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;
/**
* {@link EmployeeHttpInterface} has no class {@code @RestClientTest} can point at directly - it
* is a bare interface, and the real bean only exists because {@link AppConfig}'s
* {@code @Bean} method builds it from an {@code HttpServiceProxyFactory}. Passing the
* {@code @Configuration} class itself as the slice's "component" is what gets that bean (and
* the underlying {@code RestClient} it is built from) into the test context at all; the mocking
* code underneath is otherwise identical to {@link RestClientEmployeeTest}.
*/
@RestClientTest(components = AppConfig.class)
class HttpInterfaceClientTest {
@Autowired
private MockRestServiceServer mockServer;
@Autowired
private EmployeeHttpInterface employeeHttpInterface;
@Autowired
private ObjectMapper objectMapper;
@Test
void whenGetEmployeeById_thenHttpInterfaceReturnsEmployee() throws Exception {
Employee mockEmployee = new Employee(3, "Daniel", "O", "[email protected]");
String employeeJson = objectMapper.writeValueAsString(mockEmployee);
mockServer.expect(requestTo("http://hr-api.example.com/employees/3"))
.andRespond(withSuccess(employeeJson, MediaType.APPLICATION_JSON));
Employee result = employeeHttpInterface.getEmployeeById(3);
assertThat(result).isNotNull();
assertThat(result.id()).isEqualTo(3);
assertThat(result.firstName()).isEqualTo("Daniel");
mockServer.verify();
Capture.write("04-http-interface-client.txt",
"A declarative @HttpExchange interface client, mocked the same way as a hand-written one",
"requestTo(\"http://hr-api.example.com/employees/3\") -> 200 OK " + employeeJson + "\nresult = " + result);
}
}