이번 편의 목표: MockMvc로 등록과 조회를 자동 확인하고, package로 만든 jar를 java 명령으로 실행합니다.
서버를 띄우고 curl을 치는 확인은 직접 해 보기에 맞습니다. 코드를 바꿀 때마다 같은 확인을 반복하려면 테스트로 남깁니다. 스프링 부트 프로젝트에는 테스트 스타터가 처음부터 들어 있습니다.
API 테스트
src/test/java/com/thinktree/library/BookApiTest.java 를 추가합니다.
package com.thinktree.library;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
@SpringBootTest
@AutoConfigureMockMvc
class BookApiTest {
@Autowired
private MockMvc mockMvc;
@Test
void createsBook() throws Exception {
mockMvc.perform(post("/api/books")
.contentType(MediaType.APPLICATION_JSON)
.content("{\"title\":\"개미\",\"price\":12000}"))
.andExpect(status().isCreated());
mockMvc.perform(get("/api/books/1"))
.andExpect(status().isOk());
}
}@SpringBootTest는 애플리케이션 컨테이너를 테스트용으로 띄웁니다. MockMvc는 실제 포트를 열지 않고 컨트롤러부터 요청을 전달합니다. 이 테스트 클래스의 필드는 예외적으로 생성자 대신 @Autowired를 사용합니다. 테스트 프레임워크가 필드를 채우는 일반적인 형태이기 때문입니다.
프로젝트 폴더에서 테스트를 실행합니다.
./mvnw test
실패하면 먼저 11편의 등록이 201을 반환하는지, 첫 번호가 1인지 확인합니다. 다른 테스트가 같은 저장소에 책을 넣은 상태가 아니므로 이 클래스만 실행할 때는 id가 1입니다.
실행 파일
서버를 끈 뒤 패키지를 만듭니다.
./mvnw package
target 폴더에 library-0.0.1-SNAPSHOT.jar가 생기면 그 파일만으로 실행할 수 있습니다. 파일 이름이 다르면 target 안의 jar 이름을 사용합니다.
java -jar target/library-0.0.1-SNAPSHOT.jar
브라우저나 curl로 /api/books 를 호출해 빈 배열이 나오면, 개발 명령이 아닌 실행 파일로도 같은 API가 동작하는 것입니다.
이 연재의 사용법은 여기까지입니다. 빈과 설정으로 객체를 연결하고, 컨트롤러로 주소를 열고, 검증과 예외로 잘못된 요청을 거절한 뒤, 서비스와 저장소로 책을 남겼습니다. 서버를 재시작해도 책이 남아야 하면 메모리 리스트를 데이터베이스로 바꾸는 일이 다음 단계입니다. 컨트롤러와 서비스의 역할 구분은 그때도 그대로 둡니다.
직접 해 보기
가격 0인 JSON으로 POST하는 테스트를 하나 추가하고, 상태 400을 기대하세요. ./mvnw test 가 성공해야 합니다.
해설
@Test
void rejectsNonPositivePrice() throws Exception {
mockMvc.perform(post("/api/books")
.contentType(MediaType.APPLICATION_JSON)
.content("{\"title\":\"공책\",\"price\":0}"))
.andExpect(status().isBadRequest());
}@Positive 검증이 실패하면 10편의 예외 처리가 400을 반환합니다. create와 BookStore.save는 호출되지 않습니다.
COMMENTS
댓글 0
이 글에 대한 의견이나 질문을 남겨 주세요.
댓글은 구글이나 카카오로 시작한 뒤에 남길 수 있습니다.
등록된 댓글이 없습니다.