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
- springdatajpa
- Greedy
- spring
- 김영한
- Android
- SpringBoot
- Proxy
- Servlet
- 인프런
- transaction
- db
- 자바
- Exception
- AOP
- Spring Boot
- java
- JDBC
- QueryDSL
- JPQL
- 스프링 핵심 기능
- 백준
- http
- jpa
- 알고리즘
- 스프링
- 스프링 핵심 원리
- Thymeleaf
- pointcut
- kotlin
- 그리디
Archives
- Today
- Total
개발자되기 프로젝트
MockMVC 본문
- 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
'Project > 블로그 게시판 만들기' 카테고리의 다른 글
비로그인 사용자 글 등록/삭제/수정 test (0) | 2021.10.19 |
---|---|
@AutoConfigureMockMvc, PostController Test (0) | 2021.10.19 |
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 |
Optional (0) | 2021.10.16 |
Comments