H E L L O    W O R L D !
...

0명

총 방문자 수

...

50 개

총 포스팅

MockMvc 테스트 코드 작성중 문제

2024. 9. 10. 00:09·트러블 슈팅
목차
  1. 문제
  2. 해결

문제


      
@RestController
@RequiredArgsConstructor
public class CommentController {
private final CommentService commentService;
@PostMapping("/todos/{todoId}/comments")
public ResponseEntity<CommentSaveResponse> saveComment(
@Auth AuthUser authUser,
@PathVariable("todoId") long todoId,
@Valid @RequestBody CommentSaveRequest commentSaveRequest
) {
return ResponseEntity.ok(commentService.saveComment(authUser, todoId, commentSaveRequest));
}
@GetMapping("/todos/{todoId}/comments")
public ResponseEntity<List<CommentResponse>> getComments(@PathVariable long todoId) {
return ResponseEntity.ok(commentService.getComments(todoId));
}
}

이 클래스에 대한 테스트 코드를 작성하다가 문제가 생겼다.

첫번째는 @Auth라는 아규먼트리졸버

두번째는 테스트를 작성했는데 status는 200이 잘 나오는데 body에 아무것도 나오지 않았다.

해결

여러 정보들을 찾아봐도.. 해결하는 방법이 딱 나오지 않아서 이리저리 치였다.

먼저 첫 번째 문제인 @Auth라는 아규먼트 리졸버 부분을 해결했다.


      
@BeforeEach
public void setup(){
mockMvc = MockMvcBuilders.standaloneSetup(controller)
.setCustomArgumentResolvers(resolver)
.build();
}

standaloneSetup으로 해준 후 커스텀아규먼트 리졸버에 AuthUserArgumentResolver를 Mock으로 만들고 등록했다.


      
@WebMvcTest(controllers = {CommentController.class})
class CommentControllerTest {
@MockBean
private CommentService commentService;
@Mock
private AuthUserArgumentResolver resolver;
@MockBean
private CommentController controller;
private MockMvc mockMvc;
@BeforeEach
public void setup(){
mockMvc = MockMvcBuilders.standaloneSetup(controller)
.setCustomArgumentResolvers(resolver)
.build();
}
@Test
public void test() throws Exception {
// given
given(resolver.supportsParameter(any())).willReturn(true);
given(resolver.resolveArgument(any(), any(), any(), any())).willReturn(
new AuthUser(1L, "email", UserRole.USER));
CommentSaveRequest saveRequest = new CommentSaveRequest("test");
ObjectMapper mapper = new ObjectMapper();
String s = mapper.writeValueAsString(saveRequest);
// when
CommentSaveResponse resonse = new CommentSaveResponse(1L, "test",
new UserResponse(1L, "email"));
when(commentService.saveComment(any(AuthUser.class), anyLong(),
any(CommentSaveRequest.class))).thenReturn(
new CommentSaveResponse(1L, "test", new UserResponse(1L, "email")));
mockMvc.perform(post("/todos/{todoId}/comments", 1)
.content(s)
.contentType(MediaType.APPLICATION_JSON)).andDo(print())
.andExpect(status().is(HttpStatus.OK.value()));
// then
}
}

테스트 코드는 초록불이 뜨고, status도 200이 뜨는데 Response의 Body에 아무것도 안나오는 것을 볼 수 있었다.

이 문제도 테스트 코드를 너무 안짜봤던 경험이 문제였던 것 같다. 현재 코드에서는 controller 이부분이 MockBean으로 되어있는데 Autowired로 주입받아와서 해결했다.


      
@WebMvcTest(controllers = {CommentController.class})
class CommentControllerTest {
@MockBean
private CommentService commentService;
@Mock
private AuthUserArgumentResolver resolver;
@Autowired
private CommentController controller;
private MockMvc mockMvc;
@BeforeEach
public void setup(){
mockMvc = MockMvcBuilders.standaloneSetup(controller)
.setControllerAdvice(new GlobalExceptionHandler())
.setCustomArgumentResolvers(resolver)
.build();
}
@Test
public void test() throws Exception {
// given
given(resolver.supportsParameter(any())).willReturn(true);
given(resolver.resolveArgument(any(), any(), any(), any())).willReturn(
new AuthUser(1L, "email", UserRole.USER));
CommentSaveRequest saveRequest = new CommentSaveRequest("test");
ObjectMapper mapper = new ObjectMapper();
String s = mapper.writeValueAsString(saveRequest);
CommentSaveResponse resonse = new CommentSaveResponse(1L, "test",
new UserResponse(1L, "email"));
when(commentService.saveComment(any(AuthUser.class), anyLong(),
any(CommentSaveRequest.class))).thenReturn(
new CommentSaveResponse(1L, "test", new UserResponse(1L, "email")));
// when / then
mockMvc.perform(post("/todos/{todoId}/comments", 1)
.content(s)
.contentType(MediaType.APPLICATION_JSON)).andDo(print())
.andExpect(status().is(HttpStatus.OK.value()));
}
}

잘 나오는 것을 볼 수 있다.

글은 짧게 있지만.. 5시간 동안 헤맸다. 튜터님께 여쭤봤는데 내일 강의에서 알려주신다고 하셨다. 이 문제를 꼭 해결해보고 싶어서 이곳저곳 뒤적거리고 생각해보면서 잘 해결해서 뿌듯하다. 다만, Mockito를 이용해서 테스트 코드를 작성하는게 이번이 처음이라 잘못된 방법일 수도 있어서, 내일 한 번 확인해보고 다시 수정해봐야할 것 같다.

'트러블 슈팅' 카테고리의 다른 글

웨이팅 구현 중 동시성 이슈  (0) 2024.11.04
프로젝트 중 문제..  (0) 2024.09.03
JPA 문제  (0) 2024.08.20
깃 커밋 메세지 깨짐  (0) 2024.08.11
CORS 너는 누군데!! 나를 괴롭히냐..  (0) 2024.07.18
  1. 문제
  2. 해결
'트러블 슈팅' 카테고리의 다른 글
  • 웨이팅 구현 중 동시성 이슈
  • 프로젝트 중 문제..
  • JPA 문제
  • 깃 커밋 메세지 깨짐
nameless1004
nameless1004
nameless1004
Nameless
nameless1004
전체
오늘
어제
  • 분류 전체보기 (64)
    • DB (4)
      • MySQL (1)
    • Web (1)
    • CS (0)
    • 알고리즘 (1)
    • JAVA (4)
      • 문법 (0)
      • 디자인 패턴 (1)
    • Spring (2)
    • 트러블 슈팅 (6)
    • 부트캠프 (37)
      • Dev (25)
      • DB (6)
      • 데일리 미션 (5)
    • 도커 (3)
    • 사이드 프로젝트 (5)
      • 쿠키톡 (5)
    • 회사 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

DAO
자바
스프링 슬랙 알림
spring
dbeaver
sql
java
DTO
db
슬랙
스프링 슬랙
스프링 레디스 센티넬
인프런
유데미
레디스 센티넬
인터넷강의
자바 싱글톤 패턴
부트캠프
레디스 센티넬 도커
singleton
자바 싱글톤

최근 댓글

hELLO· Designed By정상우.v4.5.3
nameless1004
MockMvc 테스트 코드 작성중 문제

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.