https://www.baeldung.com/restclienttest-in-spring-boot/를 번역함.
1. 소개
이 기사는 @RestClientTest 주석에 대한 간략한 소개 입니다.
새 주석은 Spring 애플리케이션에서 REST 클라이언트 테스트를 단순화하고 속도를 높이는 데 도움이 됩니다.
2. Spring Boot Pre-1.4에서 REST 클라이언트 지원
Spring Boot는 Spring 애플리케이션 구성에 덜 집중하고 코드와 비즈니스 로직에 더 집중할 수 있도록 하는 일반적인 설정으로 많은 자동 구성된 Spring Bean을 제공하는 편리한 프레임워크입니다.
그러나 버전 1.3에서는 REST 서비스 클라이언트를 생성하거나 테스트할 때 많은 도움을 받지 못합니다. REST 클라이언트에 대한 지원은 그리 깊지 않습니다.
REST API용 클라이언트를 생성하려면 일반적으로 RestTemplate 인스턴스가 사용됩니다. 일반적으로 사용하기 전에 구성해야 하며 구성이 다를 수 있으므로 Spring Boot는 보편적으로 구성된 RestTemplate 빈을 제공하지 않습니다 .
REST 클라이언트 테스트도 마찬가지입니다. Spring Boot 1.4.0 이전에는 Spring REST 클라이언트를 테스트하는 절차가 다른 Spring 기반 애플리케이션과 크게 다르지 않았습니다. MockRestServiceServer 인스턴스를 만들고 테스트 중인 RestTemplate 인스턴스에 바인딩하고 다음과 같이 요청에 대한 모의 응답을 제공합니다.
RestTemplate restTemplate = new RestTemplate();
MockRestServiceServer mockServer =
MockRestServiceServer.bindTo(restTemplate).build();
mockServer.expect(requestTo("/greeting"))
.andRespond(withSuccess());
// Test code that uses the above RestTemplate ...
mockServer.verify();
또한 Spring 컨테이너를 초기화하고 필요한 구성 요소만 컨텍스트에 로드되도록 하여 컨텍스트 로드 시간(결과적으로 테스트 실행 시간)의 속도를 높여야 합니다.
3. Spring Boot 1.4+의 새로운 REST 클라이언트 기능
Spring Boot 1.4에서 팀은 REST 클라이언트의 생성 및 테스트를 단순화하고 속도를 높이기 위해 많은 노력을 기울였습니다.
그럼 새로운 기능을 확인해 볼까요?
3.1. 프로젝트에 스프링 부트 추가하기
먼저 프로젝트에서 Spring Boot 1.4.x 이상을 사용하고 있는지 확인해야 합니다.
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
3.2. RestTemplateBuilder
봄 부팅 자동 구성을 모두 제공합니다 RestTemplateBuilder 생성 단순화 RestTemplates을 하고, 일치하는 @RestClientTest 에 내장 된 클라이언트 테스트하는 주석 RestTemplateBuilder을 . RestTemplateBuilder가 자동 주입 되어 간단한 REST 클라이언트를 만드는 방법은 다음과 같습니다 .
@Service
public class DetailsServiceClient {
private final RestTemplate restTemplate;
public DetailsServiceClient(RestTemplateBuilder restTemplateBuilder) {
restTemplate = restTemplateBuilder.build();
}
public Details getUserDetails(String name) {
return restTemplate.getForObject("/{name}/details",
Details.class, name);
}
}
RestTemplateBuilder 인스턴스를 생성자에 명시적으로 연결하지 않았습니다 . 이것은 이 기사 에서 논의되는 암시적 생성자 주입이라는 새로운 Spring 기능 덕분에 가능합니다 .
RestTemplateBuilder 는 메시지 변환기, 오류 처리기, URI 템플릿 처리기, 기본 권한을 등록하기 위한 편리한 방법을 제공하고 필요한 추가 사용자 지정자를 사용합니다.
3.3. @RestClientTest
RestTemplateBuilder로 빌드된 REST 클라이언트를 테스트 하기 위해 @RestClientTest로 주석이 달린 SpringRunner 실행 테스트 클래스를 사용할 수 있습니다 . 이 주석은 전체 자동 구성을 비활성화하고 REST 클라이언트 테스트(예: Jackson 또는 GSON 자동 구성 및 @JsonComponent 빈) 와 관련된 구성만 적용 하지만 일반 @Component 빈은 적용 하지 않습니다 .
@RestClientTest 는 Jackson 및 GSON 지원이 자동 구성되도록 하고 사전 구성된 RestTemplateBuilder 및 MockRestServiceServer 인스턴스를 컨텍스트에 추가합니다. 테스트 중인 빈 은 @RestClientTest 주석 의 값 또는 구성 요소 속성으로 지정됩니다 .
@RunWith(SpringRunner.class)
@RestClientTest(DetailsServiceClient.class)
public class DetailsServiceClientTest {
@Autowired
private DetailsServiceClient client;
@Autowired
private MockRestServiceServer server;
@Autowired
private ObjectMapper objectMapper;
@Before
public void setUp() throws Exception {
String detailsString =
objectMapper.writeValueAsString(new Details("John Smith", "john"));
this.server.expect(requestTo("/john/details"))
.andRespond(withSuccess(detailsString, MediaType.APPLICATION_JSON));
}
@Test
public void whenCallingGetUserDetails_thenClientMakesCorrectCall()
throws Exception {
Details details = this.client.getUserDetails("john");
assertThat(details.getLogin()).isEqualTo("john");
assertThat(details.getName()).isEqualTo("John Smith");
}
}
먼저 @RunWith(SpringRunner.class) 주석 을 추가하여 이 테스트가 SpringRunner 로 실행되는지 확인해야 합니다 .
새로운 소식있어?
첫째 – @RestClientTest 주석을 사용하면 테스트 중인 정확한 서비스를 지정할 수 있습니다 . 이 경우에는 DetailsServiceClient 클래스입니다. 이 서비스는 테스트 컨텍스트에 로드되고 다른 모든 항목은 필터링됩니다.
이를 통해 테스트 내부 에서 DetailsServiceClient 인스턴스를 자동 연결하고 다른 모든 것을 외부에 남겨둘 수 있으므로 컨텍스트 로드 속도가 빨라집니다.
두 번째 – MockRestServiceServer 인스턴스가 @RestClientTest 주석 테스트를 위해 구성되어 있기 때문에 (그리고 우리 를 위해 DetailsServiceClient 인스턴스에 바인딩됨 ) 간단히 주입하고 사용할 수 있습니다.
마지막으로 – @RestClientTest에 대한 JSON 지원을 통해 Jackson의 ObjectMapper 인스턴스를 주입 하여 MockRestServiceServer의 모의 응답 값 을 준비할 수 있습니다.
남은 일은 서비스 호출을 실행하고 결과를 확인하는 것입니다.
4. 결론
이 기사에서 우리는 Spring으로 빌드된 REST 클라이언트의 쉽고 빠른 테스트를 허용 하는 새로운 @RestClientTest 주석에 대해 논의했습니다 .
기사의 소스 코드는 GitHub에서 사용할 수 있습니다 .