바인딩되지 않은 RestTemplate로 인해 Spring-BootRestClientTest가 MockRestServiceServer를 올바르게 자동 구성하지 않음
편집: 이 질문은 특히 공장 출하 방법을 대체하기 위해 스프링부트 1.4.0에 도입된 @RestClientTest 주석과 관련이 있습니다.
문제:
설명서에 따르면, @RestClientTest는 REST 클라이언트를 테스트할 때 사용할 MockRestServiceServer를 올바르게 구성해야 합니다.그러나 테스트를 실행할 때 MockServerRestTemplate Customizer가 RestTemplate에 바인딩되지 않았다는 불법 상태 예외가 표시됩니다.
제가 잭슨이 아닌 Gson을 deserialization에 사용하고 있다는 것을 주목할 필요가 있습니다. 그래서 제외합니다.
이 새 주석을 올바르게 사용하는 방법을 아는 사람이 있습니까?이미 설정한 경우보다 더 많은 구성이 필요한 예제를 찾지 못했습니다.
구성:
@SpringBootConfiguration
@ComponentScan
@EnableAutoConfiguration(exclude = {JacksonAutoConfiguration.class})
public class ClientConfiguration {
...
@Bean
public RestTemplateBuilder restTemplateBuilder() {
return new RestTemplateBuilder()
.rootUri(rootUri)
.basicAuthorization(username, password);
}
}
클라이언트:
@Service
public class ComponentsClientImpl implements ComponentsClient {
private RestTemplate restTemplate;
@Autowired
public ComponentsClientImpl(RestTemplateBuilder builder) {
this.restTemplate = builder.build();
}
public ResponseDTO getComponentDetails(RequestDTO requestDTO) {
HttpEntity<RequestDTO> entity = new HttpEntity<>(requestDTO);
ResponseEntity<ResponseDTO> response =
restTemplate.postForEntity("/api", entity, ResponseDTO.class);
return response.getBody();
}
}
시험
@RunWith(SpringRunner.class)
@RestClientTest(ComponentsClientImpl.class)
public class ComponentsClientTest {
@Autowired
private ComponentsClient client;
@Autowired
private MockRestServiceServer server;
@Test
public void getComponentDetailsWhenResultIsSuccessShouldReturnComponentDetails() throws Exception {
server.expect(requestTo("/api"))
.andRespond(withSuccess(getResponseJson(), APPLICATION_JSON));
ResponseDTO response = client.getComponentDetails(requestDto);
ResponseDTO expected = responseFromJson(getResponseJson());
assertThat(response, is(expectedResponse));
}
}
그리고 예외:
java.lang.IllegalStateException: Unable to use auto-configured MockRestServiceServer since MockServerRestTemplateCustomizer has not been bound to a RestTemplate
답변:
아래 답변에 따르면 RestTemplateBuilder는 스프링 부트 자동 구성에서 이미 제공되므로 컨텍스트에 포함된다고 선언할 필요가 없습니다.
프로젝트가 스프링 부트 응용 프로그램(@SpringBootApplication 주석이 있음)인 경우 이는 의도한 대로 작동합니다.그러나 위의 경우에는 프로젝트가 클라이언트 라이브러리였기 때문에 주요 응용 프로그램이 없었습니다.
RestTemplateBuilder가 기본 애플리케이션 컨텍스트(빈 제거)에 올바르게 주입되었는지 확인하려면 구성 요소 스캔에 Custom(@SpringBootApplication에서 사용하는) 필터가 필요한 필터는 @SpringBootApplication에서 사용하는 필터
@ComponentScan(excludeFilters = {
@ComponentScan.Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class)
})
그MockRestServiceServer
예는 정적 공장으로부터 구성되어야 합니다, a를 사용하여.RestTemplate
. 테스트 과정에 대한 자세한 설명은 이 문서를 참조하십시오.
예를 들어 다음을 수행할 수 있습니다.
@RunWith(SpringRunner.class)
@RestClientTest(ComponentsClientImpl.class)
public class ComponentsClientTest {
@Autowired
private ComponentsClient client;
@Autowired
private RestTemplate template;
private MockRestServiceServer server;
@Before
public void setUp() {
server= MockRestServiceServer.createServer(restTemplate);
}
/*Do your test*/
}
두 곳에 Rest Template Builder가 있습니다.클라이언트 구성 클래스 및 ComponentsClientImple 클래스에서.필요할 때 RestTemplate 인스턴스를 만드는 데 사용할 수 있는 RestTemplateBuilder를 스프링 부트 1.4.0에서 자동 구성합니다.ClientConfiguration 클래스에서 아래 코드를 제거하고 테스트를 실행합니다.
@Bean
public RestTemplateBuilder restTemplateBuilder() {
return new RestTemplateBuilder()
.rootUri(rootUri)
.basicAuthorization(username, password);
}
언급URL : https://stackoverflow.com/questions/39070654/spring-boot-restclienttest-not-correctly-auto-configuring-mockrestserviceserver
'programing' 카테고리의 다른 글
jQuery: 코드를 실행하지 않고 1초 대기/지연 (0) | 2023.09.26 |
---|---|
maxscale master slave 연결 풀에서 유효한 연결 확인 (0) | 2023.09.26 |
워드프레스 webp 이미지 미리보기 (0) | 2023.09.26 |
드라이버와 프로바이더의 차이 (0) | 2023.09.21 |
jQuery validation을 "selected" 플러그인과 함께 사용하려면 어떻게 해야 합니까? (0) | 2023.09.21 |