본문 바로가기
공부/프로그래밍

[springboot] @SpringBootTest에서 RestTemplate로 localhost 테스트 시 Connection refused

by demonic_ 2020. 12. 15.
반응형

Mock으로 테스트 하는게 아니라 RestTemplate로 localhost를 테스트 한다는 것은 서버가 임시로 떠있고 API를 호출한다는 의미다. 즉 웹서버가 떠 있어야 한다는 의민대 @SpringBootTest를 쓴다면 웹서버를 띄우는 것이 아니라 테스트에 필요한 것들을 실행하기 위해 프레임워크를 해석하는 것이다.

 

때문에 포트가 명시적으로 할당되 URL을 호출해야 하지만 떠있는 웹서버가 없기 때문에 다음의 에러가 발생하는 것이다.

org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://localhost:8080/oauth/token": Connection refused (Connection refused); nested exception is java.net.ConnectException: Connection refused (Connection refused)

그래서 http://localhost:8080 부분을 빼려고 하니 다음 에러가 발생한다.

 

ResponseEntity<String> response = restTemplate.postForEntity("/oauth/token", request, String.class);

java.lang.IllegalArgumentException: URI is not absolute

...

 

 

그래서 실행할 때 임의의 포트를 할당하도록 설정, 그리고 그 포트를 가져와 localhost:[포트번호]를 입력해 호출해야 한다.

 

우선 테스트에 등록한 @SpringBootTest에 설정을 추가한다.

 

@SpringBootTest(webEnvironment= SpringBootTest.WebEnvironment.RANDOM_PORT)
class TestApi {
    ...
}

 

그리고 랜덤으로 호출된 포트번호를 다음 어노테이션을 이용해 주입받는다

    @LocalServerPort
    int randomServerPort;

 

다시 처음처럼 수정하여 호출하자

ResponseEntity<String> response = restTemplate.postForEntity("http://localhost:"+randomServerPort+"/oauth/token", request, String.class);

 

끝.

반응형

댓글