Spring Boot 게시판 만들기 7 - 특정 페이지를 가져오기

7. 특정 포스트를 불러오기

특정 포스트 불러오기 요청 처리하기

PostController

@GetMapping("/post/{postId}")
public String getPostDetails(@PathVariable("postId")Long id, Model model){
Post post = postService.getPostById(id);

PostDto postDto = PostDto.builder()
.id(post.getId())
.name(post.getName())
.title(post.getTitle())
.content(post.getContent())
.writeTime(post.getWriteTime())
.build();

model.addAttribute("postDto", postDto);
return "details";
}

PostControllerTest.java

@Test
@DisplayName("상세 페이지를 가져온다.")
public void getPostDetails() throws Exception{
Post mockPost = Post.builder()
.id(1L)
.name("tester")
.title("test")
.content("test")
.writeTime(LocalDateTime.now())
.build();

given(postService.getPostById(any())).willReturn(mockPost);

ResultActions resultActions = mockMvc.perform(get("/post/1"));

resultActions
.andExpect(status().isOk());

verify(postService).getPostById(any());
}

PostControllerTest.java

@Test
@DisplayName("상세 페이지를 못 가져온다.")
public void getPostDetailsException() throws Exception{
given(postService.getPostById(any())).willThrow(new PostNotExistedException(1L));

ResultActions resultActions = mockMvc.perform(get("/post/1"));

resultActions
.andExpect(status().isNotFound());

verify(postService).getPostById(any());
}

포스트가 없는 경우에 대한 예외처리하기

BoardErrorAdvice.java

@ControllerAdvice
public class BoardErrorAdvice {

@ResponseBody
@ResponseStatus(HttpStatus.NOT_FOUND)
@ExceptionHandler(PostNotExistedException.class)
public void handleNotFound(){
}
}

PostNotExistedException.java

public class PostNotExistedException extends RuntimeException{
public PostNotExistedException(Long id){
super("Post id : " + id + " is not Existed");

}
}

PostService.java

public Post getPostById(Long id) {
Post post = postRepository.findById(id).orElseThrow(() -> new PostNotExistedException(id));
return post;
}

PostServiceTest.java

@Test
@DisplayName("특정 포스트를 가져온다.")
public void getPostById(){
Post mockPost = Post.builder()
.id(1L)
.name("tester")
.title("test")
.content("test")
.writeTime(LocalDateTime.now())
.build();

given(postRepository.findById(1L)).willReturn(Optional.of(mockPost));
Post post = postService.getPostById(1L);
verify(postRepository).findById(1L);

assertThat(post.getId()).isEqualTo(mockPost.getId());
assertThat(post.getTitle()).isEqualTo(mockPost.getTitle());
assertThat(post.getName()).isEqualTo(mockPost.getName());
assertThat(post.getContent()).isEqualTo(mockPost.getContent());
assertThat(post.getWriteTime()).isEqualTo(mockPost.getWriteTime());
}

@Test
@DisplayName("특정 포스트를 못 가져온다.")
public void getPostByIdException(){
Post mockPost = Post.builder()
.id(1L)
.name("tester")
.title("test")
.content("test")
.writeTime(LocalDateTime.now())
.build();

given(postRepository.findById(1L)).willThrow(new PostNotExistedException(1L));

assertThatThrownBy(() ->{
postService.getPostById(1L);
}).isInstanceOf(PostNotExistedException.class);

verify(postRepository).findById(1L);
}
Share