freelec-springboot2-webservice
freelec-springboot2-webservice copied to clipboard
[오류] 혹시 조회기능(Get)에 대한 테스트를 만들어 보신분 있나요??
기존에 올라온 질문이 아닌지 먼저 검색해주세요!
가장 자주 나온 제보
어떤 오류인가요?
오류설명: "/api/v1/posts/{id}" 에 대한 테스트를 작성하고 싶은데, 자꾸 오류가 나서 테스트가 돌아가질 않네요ㅠㅠ
프로젝트 주소
@Test
@WithMockUser(roles="USER")
public void posts_조회() throws Exception { // 추가
//given
String title = "gettest";
String content = "content";
PostsSaveRequestDto requestDto = PostsSaveRequestDto.builder()
.title(title)
.content(content)
.author("author")
.build();
String url = "http://localhost:" + port + "api/v1/posts";
mvc.perform(post(url)
.contentType(MediaType.APPLICATION_JSON_UTF8)
.content(new ObjectMapper().writeValueAsString(requestDto))) // 문자열 JSON으로 변환
.andExpect(status().isOk());
// postsService.save(requestDto);
// //when
String url2 = "http://localhost:" + port + "api/v1/posts/1";
// String response = restTemplate.getForObject(url2, String.class);
//then
mvc.perform(get(url2))
.andExpect(status().isOk())
.andDo(print());
// System.out.println(response);
// assertThat(response).contains("gettest", "content");
}
오류 로그
해당 코드에 대한 오류는 다음과 같고, org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalArgumentException: 해당 게시글이 없습니다. id =1
mvc.perform() 부분을 주석처리하고 기존 주석을 지워서 테스트를 돌리면 expecting actual not to be null 에러가 납니다ㅠ
저는 mvc.perform(post) 로 값을 DB에 올리고, 이를 다시 mvc.perform(get)으로 가져오면 되리라고 생각했지만 게시글을 찾을 수가 없네요..

이는 오류 로그 바로 전의 sql로그인데, 이렇듯 get으로 찾아오기 전에 삭제해서 찾지 못하나? 싶었는데 posts_등록() 테스트도 같은 sql로그가 뜨지만 등록된 게시글에 대한 조회 테스트가 잘 이루어지는 것을 보면 제 추측도 아닌가 싶구요 ㅠㅠ 혹시 테스트 기능에 대해 잘 아시는 분이 있다면 제가 무엇을 놓치고 있는지 말씀해주시면 감사하겠습니다!
어떤 오류인지 캡쳐해주세요.
andDo() 로 요청을 이어보려 해도 여전히 해당 게시글이 없습니다. 오류가 뜨네요 ㅠ
mvc.perform(post(url)
.contentType(MediaType.APPLICATION_JSON_UTF8)
.content(new ObjectMapper().writeValueAsString(requestDto)))
//Then chain the request
.andDo(result -> this.mvc.perform(get(url2)))
.andExpect(status().isOk());
안녕하세요! 저도 궁금해서 똑같이 테스트 해봤는데, 잘 되는것을 확인했습니다. 아무래도, url2의 String url2 = "http://localhost:" + port + "api/v1/posts/1"; <-- 글 ID 할당 부분이 잘못된 것 같습니다.
동시에 여러 테스트를 돌리실 경우, 혹은 DB가 완전히 초기화가 되지 않고 계속 값이 쌓였다 지워졌다 할 경우, 선생님이 저장하신 글의 ID가 1이 아닐수도 있기 때문일 것이라고 예측이됩니다.
위와 같이 리포지토리에서 직접 글을 가져와서 ID를 얻어내서 할당해보시는 것은 어떨까요??
그래도 안되면.. 저도 한번 더 고민을해보겠습니다..!!
그리고 개인적인 사견인데요..!
테스트 구성은 기능 별로 독립적으로 이루어지는게 좋지 않을까 하는 생각이 듭니다.
조회 기능 테스트 상에서, (조회만 멀쩡히 잘 되면 되므로) 저장은 mvc로 하지 마시고, 직접 리포지토리에 저장한 다음, 저장한 게시글이 조회되는지 테스트를 짜보는게 어떨까요?
저도 초보자라서, 저의 답변 범위가 좁을 수 있다는 점 양해부탁드리며, 참고만 하시고 자세한 부분은 검색을 해보시는 것을 추천드립니다 😅
안녕하세요! 일단 감사하다는 말씀 드리고 싶습니다. 말씀해주신 부분들이 모두 맞네요. 우선, pk값을 @GeneratedValue(strategy = GenerationType.IDENTITY) 로 설정해 두었기에 모두 삭제에도 불구하고, pk값은 1부터 시작하는 것이 아닌, 이전값 + 1부터 시작하는 것을 놓쳤습니다. 정신차리고 다시 보니 posts_수정() 테스트도 같은 메커니즘으로 id 값을 엔티티로부터 받아오고 있더군요 ㅎㅎ.. 그리고 말씀주신대로 기존의 코드는 get 기능의 테스트 안에서 post까지 테스트 하고 있기에, 유닛 테스트로 적합하지 않은 듯합니다. post기능을 거치지 않고 바로 Service를 통해 저장하는 방식으로 바꾸었습니다.
제가 h2 데이터 베이스를 사용하지 않고, mysql을 사용하다보니, 책의 테스트 디비를 분리하는 부분에서 계속 에러가 났습니다. 그래서 그냥 main의 application.properties에다가 구글 로그인 설정만 더해서 하나의 디비로 테스트까지 돌리고 있는데, pk가 계속 증가하다 보니 문제가 생기는 부분이 있지 않을까 하는 생각이 듭니다. 이 부분은 조금 더 고민해보고 수정을 해야할 듯합니다
좋은 의견 감사합니다! 덕분에 큰 도움이 됐습니다
도움이 되셨다니 다행입니다! 즐코하세요!