728x90
Service 테스트에 이어 이번언 Controller 테스트이다.
바로 코드로 확인하자.
PostControllerTest
@SpringBootTest
@AutoConfigureMockMvc
class PostControllerTest {
@Autowired
MockMvc mockMvc;
@Autowired
PostRepository postRepository;
@Autowired
ObjectMapper objectMapper;
@BeforeEach
void clean() throws Exception {
postRepository.deleteAll();
}
}
- MockMvc를 사용하므로 MockMvc 주입을 위해 @AutoConfigureMockMvc를 선언해 준다.
- JSON 형식을 사용할 때, 응답들을 직렬화하고 요청들을 역직렬화 하기 위해 사용되는 ObjectMapper를 추가 주입 시켜준다.
- 여기서는 데이터를 전송할때 문자열이어야 하기 때문에 객체들을 문자열로 바꾸어주는 직렬화를 사용하는 것이다.
- (Ojbect -> String 문자열)
- Service 테스트와 마찬가지로 테스트 실행전 PostRepository를 초기화 시켜주는 메소드도 세팅해준다.
ControllerTest시 MockMvc와 관련돼서 비슷한 메소드가 반복되면서 나온다.
mockMvc.perform(MockMvcRequestBuilders.post("/posts")
- Http 요청 메소드의 (여기선 post) 형태로 해당 주소로 (여기선 /posts)에 요청하겠다!
.contentType(MediaType.APPLICATION_JSON)
- JSON 형태로 보내겠다!
.content(objectMapper.writeValueAsString(post)))
- 본문속의 내용은 post의 내용을 objectMapper로 String 형태로 바꿔준다!
.andExpect(MockMvcResultMatchers.status().isOk())
- 기대하는 HTTP 응답 코드는 HttpStatus.OK 이다!
.andDo(MockMvcResultHandlers.print());
- 그리고 결과를 화면에 출력한다!
☞ 또한 위의 MockMvc~~ 관련 부분은 반복적으로 적어줘야 하기 때문에 static import 하여 작성시 편리하게 해주었다!
PostControllerTest
@Test
@DisplayName("게시물_저장")
void create() throws Exception {
Post post = Post.builder()
.title("제목")
.content("내용")
.build();
mockMvc.perform(post("/posts")
.contentType(APPLICATION_JSON)
.content(objectMapper.writeValueAsString(post)))
.andExpect(status().isOk())
.andDo(MockMvcResultHandlers.print());
}
@Test
@DisplayName("게시물_단건_조회")
void findOne() throws Exception {
//given
Post post = Post.builder()
.title("제목")
.content("내용")
.build();
postRepository.save(post);
//when
mockMvc.perform(get("/posts/{id}", post.getId())
.contentType(APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(jsonPath("$.title").value("제목"))
.andExpect(jsonPath("$.content").value("내용"))
.andDo(MockMvcResultHandlers.print());
}
@Test
@DisplayName("게시물_전체_조회")
void findAll() throws Exception {
//given
for (int i = 1; i <= 5; i++) {
postRepository.save(Post.builder()
.title("제목" + i)
.content("내용" + i)
.build());
}
//when
mockMvc.perform(get("/posts")
.contentType(APPLICATION_JSON))
.andExpect(status().isOk()).andDo(print());
}
@Test
@DisplayName("게시물_수정")
void update() throws Exception {
//given
Post post = Post.builder()
.title("제목")
.content("내용")
.build();
postRepository.save(post);
UpdatePostDto updatePostDto = UpdatePostDto.builder().title("제목수정").content("내용수정").build();
//when
mockMvc.perform(patch("/posts/{id}", post.getId()).contentType(APPLICATION_JSON)
.content(objectMapper.writeValueAsString(updatePostDto)))
.andExpect(status().isOk()).andDo(print());
}
@Test
@DisplayName("게시물_삭제")
void deleteTest() throws Exception {
Post post = Post.builder()
.title("제목")
.content("내용")
.build();
postRepository.save(post);
mockMvc.perform(delete("/posts/{id}", post.getId()))
.andExpect(status().isOk())
.andDo(print());
}
여기도 ServiceTest와 비슷하다.
그리고 마지막에 삭제 테스트에서 메소드 이름을 delete로 하니 아래 .perform(delete~~) 부분에서 에러가 났다.
아마도 delete 라는 것이 Http 요청 메소드로 perform에 예약어로 잡혀 있는데, 메소드명도 delete로 같으니 perform의 delete가 예약어가 아닌 위의 테스트 메소드 이름으로 판단을 한듯 하다.
'프로젝트 > RestApi_CRUD' 카테고리의 다른 글
RestApi 게시판 CRUD 연습 (5) - PostMan (0) | 2023.03.16 |
---|---|
RestApi 게시판 CRUD 연습 (3) - 유닛 테스트 : Service 테스트 (0) | 2023.03.15 |
RestApi 게시판 CRUD 연습 (2) - Service / Controller (0) | 2023.03.14 |
RestApi 게시판 CRUD 연습 (1) - 연습 이유 / 프로젝트 세팅 / Entity,DTO,Repository (0) | 2023.03.14 |