programing

바인딩되지 않은 RestTemplate로 인해 Spring-BootRestClientTest가 MockRestServiceServer를 올바르게 자동 구성하지 않음

lovejava 2023. 9. 26. 19:12

바인딩되지 않은 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