Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
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
관리 메뉴

개발자되기 프로젝트

MockMVC 본문

Project/블로그 게시판 만들기

MockMVC

Seung__ 2021. 10. 18. 23:47
  • MockMVC를 활용하여 controller의 슬라이스 테스트를 진행하자.

1. MockMVC??


  • Web Application을 서버에 배포하지 않고 Spring MVC 동작을 재현할 수 있는 클래스.

 

2. 사용 방법


  • build.gradle에 의존성 추가.
 testImplementation 'org.springframework.boot:spring-boot-starter-test'

 

3. JPA metamodel must not be empty! 


  • 몇가지 세팅 후 바로 실행에 봤는데 에러가발생.....
  • JPA는 Audting 기능이 있다.
  • Auditing을 사용하기 위해 @SpringBootApplication 클래스에 @EnabeJpaAuditing을 등록해 두었다.
  • 이렇게 @EnableJpaAuditing을 등록해 두면 모든 test에서 xxxApplicaion을 사용하기 때문에,
  • 모든 test에서 @EnableJpaAuditing을 사용해야 한다.
  • 하지만 @WebMvcTest는 Jpa관련된 Bean을 로드하지 않게 때문에, Jpa metamodel must not be Empty!! 발생!
  • JpaMetemodel이 없다하니 넣어주면 된다 ㅋㅋㅋㅋ
@WebMvcTest(MemberController.class)
@AutoConfigureWebMvc
@MockBean(JpaMetamodelMappingContext.class)
class MemberControllerTest {

 

 

4. PostControllerTest


  • @WebMvcTest 
    • MVC를 위한 테스트. Controller를 테스트 하는데 사용함.
    • @WebMvcTest를 사용하면 아래에 해당되는 애들만 스캔함.
    • @Controller, @ControllerAdvice, @JsonComponent, Converter, GenericConverter, Filter, HandlerInterceptor, WevMvcConfigurer
    • 특정 클래스를 지정할 수 도 있다.
  • Controller에 주입되는 Bean들은 별도로 @MockBean으로 지정해 주어야 한다.
  • MockMvc를 사용하기 위해서 @Autowired로 주입받는다.
  • @MockBean(JpaMetamodelMappingContext.class)는 위의 이유 참고.

 

 

4.1 Posts 조회 test


  • 모든 controller의 메서드 중 가장 간단한 posts조회 메서드를 test해보자.
  • 비로그인 사용자가 글 목록에 접속하는 경우
  • 글 목록 조회는 로그인 하지 않아도 정상적으로 처리된다.
  • 따라서 "/posts"로 접근하는 경우 HttpStatus는 ok가 되어야 한다.
  • 또한 반환되는 view이름은 "posts", model에는 "posts"객체가 있다.
@WebMvcTest(PostFormController.class)
@AutoConfigureWebMvc
@MockBean(JpaMetamodelMappingContext.class)
class PostFormControllerTest {

    @MockBean PostService postService;
    @MockBean MemberService memberService;
    @MockBean SessionManager sessionManager;
    @Autowired MockMvc mockMvc;


    @Test
    @DisplayName("비로그인, 글목록 접속")
    void findPostsTest() throws Exception {
        mockMvc.perform(
                get("/posts"))
                .andExpect(status().isOk())
                .andDo(print())
                .andExpect(view().name("post/posts"))
                .andExpect(model().attributeExists("posts"));
    }

}

 

4.2 Post 상세 조회


  • 로그인 하지 않은 사용자도 post 상세 페이지를 볼 수 있다.
  • 흠.. 하지만 post를 조회하기 위해서는 "/posts/{postId}"에 접속해야 한다.
  • controller는 전달된 postId로 DB에서 해당 post를 가져오게 된다.
  • 이렇게 되면 contoller 테스트 + jpa 테스트인데.. 흠.
  • 정말 단순하게 controller가 잘 동작하는 지 확인할 수 는 없나..
    @Test
    @DisplayName("비로그인, 글 상세 조회")
    void nonLoginAddPostTest() throws Exception {
        
        mockMvc.perform(
                get("/posts/{id}",1L))
                .andExpect(status().isOk())
                .andExpect(view().name("post/post"))
                .andExpect(model().attributeExists("post"));
    }
  • 요렇게 테스트를 진행하면... controller에서 NullPoninterException이 발생..당연..불러올게 없으니..

  • 그렇다고 @Transactional을 붙여서 저장을 시도하면 에러가 잔뜩 터진다..어쩌지..

 

5. GitHub: 211018 PostController Test, MockMVC


 

GitHub - bsh6463/blog

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

github.com

 

Comments