개별 프로젝트로 "나만의 블로그"를 개발하려고 합니다.
다른 개발자분들은 어떻게 개발하셨는지 참고하고 있는데요. "MokcMVC"라는 클래스가 많이 보이네요. 한번 알아보겠습니다.
1. MockMVC
스프링 문서와 다른 블로그를 살펴보니, 개발한 웹 프로그램을 실제 서버에 배포하지 않고도 테스트를 위한 요청을 제공하는 클래스인 것 같네요.
The Spring MVC Test framework, also known as MockMvc, provides support for testing Spring MVC applications. It performs full Spring MVC request handling but via mock request and response objects instead of a running server.
그렇다면 언제 사용할까를 찾아봤더니, 많은 분들께서 JSON 데이터를 검증할때 MockMVC를 사용하네요.
2. Controller 테스트
<테스트 환경>
- Spring Boot 3.2.0
- JUnit 5
- Java 17
<컨트롤러 생성>
해당 url의 get 요청을 받으면 getPosts()메서드가 동작하여 string을 반환합니다.
이때 @RestContorller를 사용하여 메세지 바디에 데이터를 직접 입력합니다.
@RestController
public class MockMvcController {
@GetMapping("/posts-test")
public String getPosts() {
return "success";
}
}
<컨트롤러 테스트>
- MockMVC 적용
class MockMvcControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
void getPosts() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.get("/posts-test"))
.andExpect(status().isOk()) // 200
.andExpect(content().string("success")) // responseBody message data 확인
.andDo(print()); // log method
}
*위의 코드로부터 NPE 에러발생
java.lang.NullPointerException: Cannot invoke "org.springframework.test.web.servlet.MockMvc.perform(org.springframework.test.web.servlet.RequestBuilder)" because "this.mockMvc" is null
문제는 의존관계 주입이 누락되어서 그런 것 같습니다. 해결방법은 클래스 레벨에서 @WebMvcTest 애노테이션을 해주면 mockBean으로 등록한 다음 의존관계 주입이 완료되겠죠.
3. 결과
@WebMvcTest // 추가
class MockMvcControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
void getPosts() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.get("/posts-test"))
.andExpect(status().isOk()) // 200
.andExpect(content().string("success")) // responseBody message data 확인
.andDo(print()); // log method
}
}
andDo(print())를 통해 로깅데이터까지 확인해봤습니다.
[출처]
- https://velog.io/@bimilless/%EC%9D%98%EC%A1%B4%EA%B4%80%EA%B3%84-%EC%A3%BC%EC%9E%85-%EB%B0%A9%EB%B2%95 (호출했을 때는 NPE(Null Point Exception)이 발생하는데 의존관계 주입 이 누락되었기 때문에 발생한다)
- https://docs.spring.io/spring-framework/reference/testing/spring-mvc-test-framework.html
- https://katfun.tistory.com/entry/Spring-MockMVC%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-Controller-%ED%85%8C%EC%8A%A4%ED%8A%B8-GET
- https://velog.io/@merci/Spring-%EB%B8%94%EB%A1%9C%EA%B7%B8-%EB%A7%8C%EB%93%A4%EA%B8%B0-V1-2-wxb8r42v
'Spring' 카테고리의 다른 글
Spring Web MVC - @Controller / @RestController (0) | 2023.12.26 |
---|---|
리팩토링이 왜 필요한가? (0) | 2023.12.14 |
프로젝트준비과정 - @PostMapping / @GetMapping (0) | 2023.11.27 |
인터넷 통신 기초 (IP/패킷/TCP) (1) | 2023.11.23 |
객체지향 설계 원칙 5가지 - SOLID (0) | 2023.11.13 |