API 에 대한 테스트를 하기 위해서는 실제로 서버가 구동되어야 하므로 빠르게 하기 어렵다. 그래서 API 에 대한 기능테스트를 하기 위해 스프링에서 제공하는 기능이 있다. 스프링 컨테이너를 호출하여 테스트 하기 위한 @SpringBootTest 에 설정값을 추가하여 할 수 있다.

backend/src/test/java/com/woowacourse/momo/acceptance/AcceptanceTest.java

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class AcceptanceTest {

    @Value("${local.server.port}")
    private int port;

    @BeforeEach
    public void init() {
        RestAssured.port = port;
    }
}

https://github.com/woowacourse-teams/2022-momo/blob/main/backend/src/test/java/com/woowacourse/momo/acceptance/AcceptanceTest.java

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) 로 설정해두면 된다. 스프링에 대한 테스트를 구동하려는데, 스프링에서 제공하는 내장 톰캣을 이용하여 API 에 대한 테스트를 하겠다는 의미이다. 속성값으로 추가한 값은 스프링 부트 테스트를 진행할 때 랜덤 포트를 이용해서 하겠다는 의미이다.

@Value("${local.server.port}") 는 랜덤 포트로 돌아가는 서버에서 포트 정보를 추출하는 코드이다. port 에는 해당 서비스에서 사용되는 포트 정보가 담겨있다. RestAssured 에 포트 정보를 담았다.

backend/src/test/java/com/woowacourse/momo/acceptance/RestHandler.java

package com.woowacourse.momo.acceptance;

import org.springframework.http.MediaType;

import io.restassured.RestAssured;
import io.restassured.response.ValidatableResponse;

public class RestHandler {

    public static ValidatableResponse getRequest(String path) {
        return RestAssured.given().log().all()
                .contentType(MediaType.APPLICATION_JSON_VALUE)
                .when()
                .get(path)
                .then().log().all();
    }

		...
}

https://github.com/woowacourse-teams/2022-momo/blob/main/backend/src/test/java/com/woowacourse/momo/acceptance/RestHandler.java

RestAssured 는 위의 코드처럼 사용할 수 있다.

최종적으로 스프링의 내장 톰캣을 이용해 작동하는 서버는 localhost:{port}/{url} 의 형식으로 동작한다.