
이 글은 다음을 참조하여 작성되었습니다. 배움의 기회를 얻어 감사합니다. 🙇🏻♂️
환경설정
- Java 11
- Jar package 생성
- Gradle
- Spring Boot 2.6.10
Dependencies :
- Lombok
- Spring Web
- Spring Data JPA
- H2 Database
작업하면서 추후 필요 플러그인 종속 예정
기존 html을 렌더링해주는 SSR 방식 대신,
React 또는 Vue + SSR 형태로
Javascript와 API 통신하는 구조 체험
Vue <-> API(JSON) 형태 채택
@RestController
public class PostController {
@GetMapping("/v1/posts")
public String get(){
return "Hello World";
}
}
⌘ + ⇧ + T : 해당 객체 테스트 케이스 생성 (IntelliJ)
@WebMvcTest
class PostControllerTest {
@Autowired
private MockMvc mockMvc; // 1
@Test
@DisplayName("/ return 'Hello World' when request 'posts'.")
@NotNull
void test() throws Exception { // 2
// expected
mockMvc.perform(get("/posts"))
.andExpect(status().isOk()) // 3
.andExpect(MockMvcResultMatchers.content().string("Hello World")) // 4
.andDo(print()); // 5
}
}
1 : MockMvc 활용하여 실제 컨트롤러에 요청 날려보기
2 : 메서드 시그니처에 Exception 추가
3 : MockMvcResultMatchers.status().isOk(), 항상 status code 일치(200)해야 하는 것 까먹지 말기
4 : "posts" 요청 + status code 200 일시 기대되는 string 값("Hello World")
5 : MockMvcResultHandlers.print(), 웹 요청 summary 로깅
@RestController
public class PostController {
@PostMapping("/posts")
public String post(){
return "Hello World";
}
}
mockMvc는 일반적으로 Content-type을 /application/json 형태로 받는다. (직접 요청 or 요청 받을 시, x-www-form-urlencoded에서 json형태 사용으로 바뀌는 추세)
글 제목, 글 내용 데이터 전달 기능 추가를 위해 테스트 코드를 변경해보기
@WebMvcTest
class PostControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
@DisplayName("/ return 'Hello World' when request 'posts'.")
@NotNull
void test() throws Exception {
//
// expected
mockMvc.perform(post("/posts")
.contentType(MediaType.APPLICATION_FORM_URLENCODED)
.param("title","제목입니다.")
.param("content","내용입니다. ㅎ"))
.andExpect(status().isOk())
.andExpect(MockMvcResultMatchers.content().string("Hello World")) // 4
.andDo(print());
}
}

테스트를 성공했다면 실제 서버에서 데이터를 받는 방법을 사용하여 검증해보아야 한다.
@RequestParam을 사용하여 String 형태의 key-value 객체를 생성해주고 로깅을 하는게 맞지만,
실제 서비스가 아닌 토이 프로젝트인 만큼 우선 System.out.println을 사용해보...지 말고!!
실전이라고 생각하고 롬복을 사용해보았다.
보편적인 공통 인터페이스 @Slf4j를 사용했다.
@Slf4j
@RestController
public class PostController {
@PostMapping("/posts")
public String post(@RequestParam String title, @RequestParam String content){
log.info("title = {}, content = {}", title, content);
return "Hello World";
}
}

@PostMapping("/posts")
public String post(@RequestParam Map<String, String> params ){
log.info("params = {}",params);
String title = params.get("title");
return "Hello World";
}
이런 식으로도 활용 가능