카테고리 없음

RestClientTest 주석이 RestTemplate을 자동 구성하지 못함

기록만이살길 2021. 2. 25. 19:38
반응형

RestClientTest 주석이 RestTemplate을 자동 구성하지 못함

1. 질문(문제점):

RestTemplate 종속성이있는 클래스가 있습니다.

@Service
public class SwiftAPIPushHandler {

    private final ObjectMapper objectMapper;

    private final RestTemplate restTemplate;

    @Value("${app.swift.host}")
    private String swiftHost;

    @Value("${app.swift.client.secret}")
    private String clientSecret;

    public SwiftAPIPushHandler(@Autowired RestTemplate restTemplate,
                                     @Autowired ObjectMapper objectMapper) {
        this.restTemplate = restTemplate;
        this.objectMapper = objectMapper;
    }

    @ServiceActivator
    public Map<String, Object> outboundSwiftPushHandler(Map<String, Object> payload,
                                                              @Header("X-UPSTREAM-WEBHOOK-SOURCE") String projectId) throws JsonProcessingException {
        // HTTP POST Request from RestTemplate here 
    }
}

그리고 테스트 @RestClientTest에서 자동 구성 에 사용 하고 싶습니다 .RestTemplate

@RestClientTest
@SpringJUnitConfig(classes = {SwiftAPIPushHandler.class})
public class SwiftAPIPushHandlerTest {

    @Autowired
    SwiftAPIPushHandler apiPushHandler;

    @Test
    public void testSwiftApiPush(
            @Value("classpath:sk-payloads/success-response.json") Resource skPayload) throws IOException {
                // blah blah blah
            }
}

그러나 RestTemplate 오류에 대한 자동 연결 후보를 찾을 수 없어 테스트가 실패합니다.

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of constructor in com.swift.cloud.transformation.engine.SwiftAPIPushHandler required a bean of type 'org.springframework.web.client.RestTemplate' that could not be found.

The injection point has the following annotations:
    - @org.springframework.beans.factory.annotation.Autowired(required=true)


Action:

Consider defining a bean of type 'org.springframework.web.client.RestTemplate' in your configuration.

2. 해결방안:

@RestClientTest당신 의 문서에서 다음을 읽을 수 있습니다.

RestTemplateBuilder를 사용하지 않고 대신 RestTemplate을 직접 주입하는 Bean을 테스트하는 경우 @AutoConfigureWebClient (registerRestTemplate = true)를 추가 할 수 있습니다.

따라서 테스트 클래스에 추가 @AutoConfigureWebClient(registerRestTemplate = true)하면 restTemplate을 올바르게 삽입해야합니다.

@RestClientTest
@AutoConfigureWebClient(registerRestTemplate = true)
@SpringJUnitConfig(classes = {SwiftAPIPushHandler.class})
public class SwiftAPIPushHandlerTest {

대안은 RestTemplateBuilder서비스에를 삽입하는 것 입니다.이 경우 @AutoConfigureWebClient테스트에 주석이 필요하지 않습니다 .

@Autowired
public SwiftAPIPushHandler(RestTemplateBuilder restTemplateBuilder, ObjectMapper objectMapper) {
    this.restTemplate = restTemplateBuilder.build();
    this.objectMapper = objectMapper;
}
65806474
반응형