Spring 심화주차/1주차

7. Controller는 어떻게 테스트할까?

note994 2024. 9. 17. 13:35

MockSpringSecurityFilter.java
0.00MB

 

MockSpringSecurityFilter.java

Spring에서 제공하는 기본 Filter를 구현한다.

16번째 줄의 SecurityContextHolder가 인증객체를 담고있는 컨텍스트를 담는 공간

setAuthentication = 인증객체 주는것


우리는 인증객체를 실제로 만들것이다.

Mock처럼 우리는 가짜 필터를 만드는 것이다.

Security가 동작하면 테스트하는데 방해가 된다. 그래서 가짜 Security를 만들어서 사용한다.


UserProductMvcTest.java
0.01MB
UserProductMvcTest.java

이 애노테이션을 통해서 컨트롤러를 테스트할 수 있다

 

또한 테스트할 컨트롤러를 지정한다. 여기서는 UserController.class, ProductController.class 컨트롤러를 지정했다.

excludeFilters = 제외할 것

WebSecurityConfig.class는 개발자가 만든 클래스다.

UserProductMvcTest.java

저 부분에서 API를 테스트한다. 어떤 형식으로 요청을 보낼지 지정한다 여기서는 get 요청을 보냈다.

 

.andExpect(status().isOk()) : 예측하는 HTTP 스테이터스 코드 여기서는 OK인 200을 예측한다.

 

.andExpect(view().name("login")) : 반환되는 html 파일을 예측 여기서는 login.html을 반환할것을 예측


이대로 테스트코드를 실행하면 오류가 발생한다.

MyselectshopApplication.java

이게 문제가 된다.

 

테스트를 하는데 JPA쪽은 필요가 없는데 이게 방해를 한다.

config 패키지에 JpaConfig 클래스를 만든다.

JpaConfig.java
0.00MB

 

그리고 테스트를 위해 MyselectshopApplication.java에 있는 @EnableJpaAudition을 제거한다.

 

이렇게하면 테스트가 된다.

UserProductMvcTest.java

 

  • this.mockUserSetup(): 이 메서드는 테스트 환경에서 인증된 사용자를 설정하는 역할을 합니다. (테스트를 위한 Mock 사용자 설정)
  • ProductRequestDto 객체 생성:
    • 관심 상품 등록을 위한 title, imageUrl, linkUrl, lPrice를 포함한 요청 데이터가 담긴 ProductRequestDto 객체를 생성합니다.
  • postInfo:
    • ProductRequestDto 객체를 JSON 문자열로 변환합니다. 이 JSON 데이터는 POST 요청의 본문으로 전송됩니다.
    • objectMapper.writeValueAsString(requestDto)는 Jackson 라이브러리를 사용해 객체를 JSON으로 직렬화합니다.
  • mvc.perform():
    • MockMvc 객체를 사용해 /api/products 엔드포인트에 POST 요청을 보냅니다.
    • content(postInfo): JSON 직렬화된 데이터를 요청 본문에 담습니다.
    • contentType(MediaType.APPLICATION_JSON): 요청 본문이 JSON 형식임을 명시합니다.
    • accept(MediaType.APPLICATION_JSON): 서버로부터 JSON 형식의 응답을 기대한다는 것을 설정합니다.
    • principal(mockPrincipal): 가짜 인증 정보(mockPrincipal)를 요청에 포함시킵니다.
  • andExpect(status().isOk()):
    • 응답 상태 코드가 200 OK인지 확인합니다. 이는 요청이 성공적으로 처리되었음을 의미합니다.
  • andDo(print()):
    • 테스트 실행 시 요청과 응답을 콘솔에 출력합니다. 디버깅 목적으로 사용됩니다.