스프링부트 테스트로 만든 상품등록 테스트를 실제로 사용자가 HTTP 사용자가 등록 요청을 했을 때 정보를 메모리에 저장하고 201 Status 코드로 응답하는 API로 전환해보자.

 

먼저 의존성을 추가해준다.

아래와 같이 Dependencies 창을 열어준 다음에

그 다음에 rest-assured 라는 단어를 검색해보자.

 

화면과 같이 바꿔준 다음 오른쪽에 있는 Add 버튼을 클릭하면 Gradle 설정파일에 다음과 같이 의존성이 추가된다.

 

의존성이 추가되면 화면 오른쪽에 아래와 같이 생긴 아이콘이 생성되는데 클릭하게 되면 그레이들 빌드가 시작된다.

 

빌드가 완료가 되면 기존에 사용했던 ProductServiceTest 를 ProductApiTest 로 이름을 변경하고 ApiTest 클래스를 상속받아 사용하도록 바꿔준다.

 

먼저 ApiTest.java를 아래의 경로에 만들어 준다.

 

ApiTest.java

package com.example.productorderservice;

import io.restassured.RestAssured;
import org.junit.jupiter.api.BeforeEach;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.server.LocalServerPort;

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

    @LocalServerPort
    private int port;

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

 

ProductServiceTest.java >>  ProductApiTest.java로 이름변경 및 내용 수정

package com.example.productorderservice.product;

import com.example.productorderservice.ApiTest;
import io.restassured.RestAssured;
import io.restassured.response.ExtractableResponse;
import io.restassured.response.Response;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;


// ApiTest를 상속시켜주고 스프링부트테스트 어노테이션을 삭제해줬다.
class ProductApiTest extends ApiTest { 

	// 상품등록() 의 내용 변경됨.
    @Test
    void 상품등록() {
        final AddProductRequest request = 상품등록요청_생성();

        // API 요청 
        final ExtractableResponse<Response> response = RestAssured.given().log().all()
                .contentType(MediaType.APPLICATION_JSON_VALUE)
                .body(request)
                .when()
                .post("/products")
                .then()
                .log().all().extract();

        assertThat(response.statusCode()).isEqualTo(HttpStatus.CREATED.value());
    }

    private static AddProductRequest 상품등록요청_생성() {
        final String name ="상품명";
        final int price = 1000;
        final DiscountPolicy discountPolicy = DiscountPolicy.NONE;
        return new AddProductRequest(name, price, discountPolicy);
    }


}

 

이렇게 변경을 한 후 실행을 하면 아래와 같은 결과가 나온다.

 

POST 메소드의 Request 라는 정보와 사용하는 포트의 /products 라는 URL로 요청을 보낸다.

Content-Type은 json이며, 요청 내용에는 name, price, discountPolicy 에 대한 json타입의 정보가 담겨져 있다.

 

 

그 이후에는 다음과 같은 에러가 발생하는데 해당 요청을 처리하는 Controller가 없기 때문이다.

 

ProductService.java 수정

 

package com.example.productorderservice.product;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


// 기존 @Component 어노테이션을 아래와 같이 RestController와 RequestMapping 어노테이션으로 바꿔준다.
@RestController
@RequestMapping("/products")
class ProductService {
    private final ProductPort productPort;

    ProductService(final ProductPort productPort) {
        this.productPort = productPort;
    }

	// Post 메소드에 맵핑되는 PostMapping 어노테이션을 사용해 요청을 처리해주도록 수정
    @PostMapping
    public ResponseEntity<Void> addProduct(@RequestBody final AddProductRequest request){
        final Product product = new Product(request.name(), request.price(), request.discountPolicy());

        productPort.save(product);

        return ResponseEntity.status(HttpStatus.CREATED).build();
    }
}

 

위와 같이 수정을 한 수 다시  ProductApiTest를 실행하면 다음과 같이 요청 뒤에 201로 응답이 리턴된다.

 


 

요청이 성공하였으니, ApiTest에 있는 Api요청 부븐을 리펙토링으로 메소드로 추출을 해준다. 방법은 아래와 같다.

 

 

리펙토링 할 부분을 선택한 다음에 컨트롤+1 또는 알트+엔터 를 누르면 아래아 같이 어떤 것을 실행할지 묻는 창이 나온다.

 

 

여기서 Extract method를 선택하게 되면 다음과 같이 하나의 메소드로 추출이 된다.

 

그 이후 다시 response를 선택 한 후 컨트롤+1 을 눌러서 인라인으로 변경해준다.

 

 

다음 시간에는 JPA를 통하여 H2 DataBase에 저장하는 것을 진행해보자~!!

 

Git: https://github.com/ShinHenry/product-order-service.git
branch :  Switch_to_API_test
출처 : 실전! 스프링부트 상품-주문 API 개발로 알아보는 TDD

+ Recent posts