47일차 - Controller 테스트

2024. 9. 11. 16:02·Java & Spring/Spring

1. 가짜 인증 처리(MockSpringSecurityFilter)

import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;

import java.io.IOException;

public class MockSpringSecurityFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) {}

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        SecurityContextHolder.getContext()
                .setAuthentication((Authentication) ((HttpServletRequest) req).getUserPrincipal());
        chain.doFilter(req, res);
    }

    @Override
    public void destroy() {
        SecurityContextHolder.clearContext();
    }
}

 

2. 테스트 코드 작성

  • @WebMvcTest 애노테이션 사용
  • controller = {테스트할 컨트롤러 지정}
  • excludeFilters = {제외할 항목 지정}
  • mvc : 가짜 http요청을 날리는 것
@WebMvcTest(
        controllers = {UserController.class, ProductController.class},
        excludeFilters = {
                @ComponentScan.Filter(
                        type = FilterType.ASSIGNABLE_TYPE,
                        classes = WebSecurityConfig.class
                )
        }
)
class UserProductMvcTest {
    private MockMvc mvc;

    private Principal mockPrincipal;

    @Autowired
    private WebApplicationContext context;
    @Autowired
    private ObjectMapper objectMapper;
    @MockBean
    UserService userService;
    @MockBean
    KakaoService kakaoService;
    @MockBean
    ProductService productService;
    @MockBean
    FolderService folderService;
    
    @BeforeEach
    public void setup() {
        mvc = MockMvcBuilders.webAppContextSetup(context)
                .apply(springSecurity(new MockSpringSecurityFilter()))
                .build();
    }

    private void mockUserSetup() {
        // Mock 테스트 유져 생성
        String username = "sollertia4351";
        String password = "robbie1234";
        String email = "sollertia@sparta.com";
        UserRoleEnum role = UserRoleEnum.USER;
        User testUser = new User(username, password, email, role);
        UserDetailsImpl testUserDetails = new UserDetailsImpl(testUser);
        mockPrincipal = new UsernamePasswordAuthenticationToken(testUserDetails, "", testUserDetails.getAuthorities());
    }

    @Test
    @DisplayName("로그인 Page")
    void test1() throws Exception {
        // when - then
        mvc.perform(get("/api/user/login-page"))
                .andExpect(status().isOk())
                .andExpect(view().name("login"))
                .andDo(print());
    }

    @Test
    @DisplayName("회원 가입 요청 처리")
    void test2() throws Exception {
        // given
        MultiValueMap<String, String> signupRequestForm = new LinkedMultiValueMap<>();
        signupRequestForm.add("username", "sollertia4351");
        signupRequestForm.add("password", "robbie1234");
        signupRequestForm.add("email", "sollertia@sparta.com");
        signupRequestForm.add("admin", "false");

        // when - then
        mvc.perform(post("/api/user/signup")
                        .params(signupRequestForm)
                )
                .andExpect(status().is3xxRedirection())
                .andExpect(view().name("redirect:/api/user/login-page"))
                .andDo(print());
    }
}

 

3. JpaConfig

@Configuration // 아래 설정을 등록하여 활성화 합니다.
@EnableJpaAuditing // 시간 자동 변경이 가능하도록 합니다.
public class JpaConfig {
}

 

 

 

 

 

'Java & Spring > Spring' 카테고리의 다른 글

JPA - 데이터베이스와 SQL  (4) 2024.09.26
테스트코드 작성에 사용되는 메서드 및 애노테이션(1)  (0) 2024.09.23
46일차 - 테스트 코드 애노테이션  (2) 2024.09.10
JWT 구현 및 사용  (0) 2024.09.09
37일차 - Spring강의(JPA Audting)  (0) 2024.09.04
'Java & Spring/Spring' 카테고리의 다른 글
  • JPA - 데이터베이스와 SQL
  • 테스트코드 작성에 사용되는 메서드 및 애노테이션(1)
  • 46일차 - 테스트 코드 애노테이션
  • JWT 구현 및 사용
DJ.Kang
DJ.Kang
백엔드 개발 기록 블로그
  • DJ.Kang
    DJ Hello World
    DJ.Kang
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 이론공부
        • 개념
        • 정보처리기사 필기
        • 정보처리기사 실기 기출
        • 네트워크관리사 2급
        • SQLD
      • 시스템설계
      • Java & Spring
        • TIL
        • 트러블슈팅
        • 고도화
        • 알고리즘
        • 코딩테스트
        • Java
        • Spring
        • Thymeleaf
      • 프로젝트
        • coin-trading
        • 트러블슈팅
      • Docker
      • 웹
      • git & github
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    자료구조
    java two-pointer
    java기초
    데이터 타입
    java
    프로그래머스 java 기초트레이닝
    java 제어자
    java arrays.copyofrnage()
    java super
    프로그래머스 java 기초 트레이닝
    데이터 크기
    java 멤버
    java enhance switch
    java 메서드
    java 유클리드 호제법
    java 에라토스테네스의 체
    Java this
    개발로드맵
    Java 생성자
    java 세수의합
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
DJ.Kang
47일차 - Controller 테스트
상단으로

티스토리툴바