Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 스프링 핵심 원리
- JPQL
- 그리디
- java
- kotlin
- 스프링
- Greedy
- Exception
- 스프링 핵심 기능
- QueryDSL
- JDBC
- springdatajpa
- 김영한
- Servlet
- db
- Android
- 인프런
- jpa
- transaction
- Spring Boot
- pointcut
- http
- 알고리즘
- Proxy
- AOP
- SpringBoot
- 자바
- spring
- 백준
- Thymeleaf
Archives
- Today
- Total
개발자되기 프로젝트
@AutoConfigureMockMvc, PostController Test 본문
- 현재 Controller Test목적은 Mock 환경에서 Controller가 의도대로 응답을 하는지 확인하는 것이다.
- 앞선 글에서는 Controller를 test하기 위해 아래 두 annotation을 사용했다.
- @WebMvcController
- @AutoConfigureWebMvc
- 그 상태에서 DB에 접근하는 등 단순한 slice 이상의 테스트를 진행하기는 어려웠다.
- 본격적인 test에 앞서 Test와 관련된 annotation을 알아보자.
1. Test관련 Annotaion
- @SpringBootTest : Spring 통합 테스트
- @WebMvcTest : @Controller, @RestController 등을 bean으로 등록함.
- @Service, @Repository는 스캔 안함.
- @AutoConfigureMockMvc : @Controller 외에도 @Service, @Repository도 스캔함.
- 그래서 @SpringBootTest와 @AutoConfigureMockMvc를 같이 쓰면
- Mock환경에서 Controller Test가 가능하다.
- 주의! @WebMvcTest, @SpringBootTest 모두 MockMvc를 모킹하기 때문에 같이쓰면 충돌이 발생.
2. PostControllerTest : 정상 케이스
- Mock환경에서 PostController를 테스트 해보자.
- 의도한 대로 Controller가 응답해야 한다.
2.1 TestSetting
- Test진행에 필요한 Bean들을 주입시켜주자.
@AutoConfigureMockMvc
@SpringBootTest
@Transactional
class PostFormControllerTest {
@Autowired PostFormController postFormController;
@Autowired PostService postService;
@Autowired MemberService memberService;
@Autowired SessionManager sessionManager;
@Autowired MockMvc mockMvc;
@Autowired EntityManager em;
}
- Test에 사용할 Data를 추가해주자.
@BeforeEach
void initTest(){
Post post1 = new Post("test1", "test1");
postService.savePost(post1);
Post post2 = new Post("test2", "test2");
postService.savePost(post2);
Member member = new Member("testMember", "testId", "testPW", "test@emaail.com");
memberService.joinMember(member);
post1.setMember(member);
post2.setMember(member);
em.flush();
em.clear();
}
@AfterEach
void afterTest(){
postService.clear();
}
2.2 비로그인_글목록
- 비로그인 유저가 글목록 페이지 접근하는 경우
- andReturn()을 사용하면 ModelAndView를 꺼낼 수 있다.
- Model을 직접 꺼내서 맘대로 사용 가능.
@Test
void 비로그인_글목록() throws Exception {
ModelAndView mav = mockMvc.perform(
get("/posts"))
.andExpect(status().isOk())
.andDo(print())
.andExpect(view().name("post/posts"))
.andExpect(model().attributeExists("posts"))
.andReturn().getModelAndView();
List<PostDto> posts = (List<PostDto>) mav.getModel().get("posts");
assertThat(posts.size()).isEqualTo(2);
}
2.3 비로그인_게시글_상세
@Test
void 비로그인_게시글_상세() throws Exception {
Post post1 = postService.findPostByTitle("test1");
System.out.println("test1 = " + post1.getId());
ModelAndView mav = mockMvc.perform(
get("/posts/{id}", post1.getId()))
.andExpect(status().isOk())
.andExpect(view().name("post/post"))
.andExpect(model().attributeExists("post"))
.andReturn().getModelAndView();
PostDto post = (PostDto) mav.getModel().get("post");
assertThat(post.getId()).isEqualTo(post1.getId());
}
2.4 로그인_글목록
- 로그인 유저가 글 목록을 조회하는 경우
- 유저 로그인(가정)
- 로그인한 유저는 authority 부여
- 로그인 처리를 위해 Session 생성
- sessionId를 Request의 Cookie에 담아 보냄.
@Test
void 로그인_글목록() throws Exception {
//when
Member member = memberService.findMemberByUserId("testId");
//then, member가 login
MemberDto loginMember = member.memberToDto();
loginMember.setAuthority(Authority.normal);
MockHttpServletResponse response = new MockHttpServletResponse();
sessionManager.createSession(loginMember, response);
//then
ModelAndView mav = mockMvc.perform(
get("/posts").requestAttr("member", loginMember).cookie(response.getCookie(SESSION_COOKIE_NAME)))
.andExpect(status().isOk())
.andExpect(view().name("post/posts"))
.andExpect(model().attributeExists("posts"))
.andReturn().getModelAndView();
/**
* 로그인 정보 비교
*/
CheckLoginMember(member, mav);
}
2.5 로그인_게시글_상세
- 로그인 유저가 게시글 상세 페이지를 조회하는 경우
- 유저 로그인(가정)
- 로그인한 유저는 authority 부여
- 로그인 처리를 위해 Session 생성
- sessionId를 Request의 Cookie에 담아 보냄.
@Test
void 로그인_게시글_상세() throws Exception {
//when
Member member = memberService.findMemberByUserId("testId");
Post post1 = postService.findPostByTitle("test1");
//then, member가 login
MemberDto loginMember = member.memberToDto();
loginMember.setAuthority(Authority.normal);
MockHttpServletResponse response = new MockHttpServletResponse();
sessionManager.createSession(loginMember, response);
//post 조회
ModelAndView mav = mockMvc.perform(
get("/posts/{id}", post1.getId())
.requestAttr("member", loginMember)
.cookie(response.getCookie(SESSION_COOKIE_NAME)))
.andExpect(status().isOk())
.andExpect(view().name("post/post"))
.andExpect(model().attributeExists("post"))
.andReturn().getModelAndView();
/**
* 조회한 게시글 정보 확인
*/
PostDto post = (PostDto) mav.getModel().get("post");
assertThat(post.getId()).isEqualTo(post1.getId());
assertThat(post.getContent()).isEqualTo(post1.getContent());
assertThat(post.getLastModifiedDate()).isEqualTo(post1.getLastModifiedDate());
/**
* 로그인 정보 비교
*/
CheckLoginMember(member, mav);
}
2.6 로그인 정보 확인
/**
* 로그인한 유저가 posts페이지 접속했을 때 로그인 정보 확인
*/
private void CheckLoginMember(Member member, ModelAndView mav) {
MemberDto returnMember = (MemberDto) mav.getModel().get("member");
assertThat(returnMember.getId()).isEqualTo(member.getId());
assertThat(returnMember.getUserId()).isEqualTo(member.getUserId());
assertThat(returnMember.getName()).isEqualTo(member.getName());
assertThat(returnMember.getEmail()).isEqualTo(member.getEmail());
}
3. 결과
- 현재까지 모든 테스트 통과
4. GitHub: 211019 PostController Test
'Project > 블로그 게시판 만들기' 카테고리의 다른 글
Paging처리 (0) | 2021.10.21 |
---|---|
비로그인 사용자 글 등록/삭제/수정 test (0) | 2021.10.19 |
MockMVC (0) | 2021.10.18 |
SessionManager Test 추가 (0) | 2021.10.17 |
This application has no explicit mapping for /error, so you are seeing this as a fallback. (0) | 2021.10.16 |
Comments