Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

@AutoConfigureMockMvc, PostController Test 본문

Project/블로그 게시판 만들기

@AutoConfigureMockMvc, PostController Test

Seung__ 2021. 10. 19. 23:06
  • 현재 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를 모킹하기 때문에 같이쓰면 충돌이 발생.
 

Spring Boot Features

Graceful shutdown is supported with all four embedded web servers (Jetty, Reactor Netty, Tomcat, and Undertow) and with both reactive and Servlet-based web applications. It occurs as part of closing the application context and is performed in the earliest

docs.spring.io

 

 

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


 

GitHub - bsh6463/blog

Contribute to bsh6463/blog development by creating an account on GitHub.

github.com

 

Comments