Junit Test Application-24-successfulAuthentication JUnit 테스트

jaegeunsong97·2023년 8월 5일
0

Junit Bank Application 깃허브

Junit Bank Application 기록 노션

package shop.mtcoding.bank.config.jwt;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.ResultActions;

import com.fasterxml.jackson.databind.ObjectMapper;

import shop.mtcoding.bank.dto.user.UserRequestDto.LoginRequestDto;

@AutoConfigureMockMvc
@SpringBootTest(webEnvironment = WebEnvironment.MOCK)
public class JwtAuthenticationFilterTest {

     @Autowired
     private ObjectMapper om;
     @Autowired
     private MockMvc mvc;

     @Test
     public void successfulAuthentication_test() throws Exception {
          // given
          LoginRequestDto loginRequestDto = new LoginRequestDto();
          loginRequestDto.setUsername("ssar");
          loginRequestDto.setPassword("1234");
          String reqeustBody = om.writeValueAsString(loginRequestDto);
          System.out.println("테스트 : " + reqeustBody);

          // when
          ResultActions resultActions = mvc
                    .perform(post("/api/login").content(reqeustBody).contentType(MediaType.APPLICATION_JSON));
          String reasponseBody = resultActions.andReturn().getResponse().getContentAsString();
          System.out.println("테스트 : " + reasponseBody);

          // then

     }

실핼 시 오류 발생 -1 발생

이유 : ssar이 DB에 존재 X

동작 순서 확인

successfulAuthentication 발동

강제로그인 발동 -> UserDetailsService를 구현한 LoginService 발동

이때 Username을 넣는데, username이 없기 때문에 InternalAuthenticationServiceException 에러 발생

에러를 catach 해서

아래의 unsuccessfulAuthentication 발동

  • 테스트 코드 추가
package shop.mtcoding.bank.config.jwt;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.ResultActions;

import com.fasterxml.jackson.databind.ObjectMapper;

import shop.mtcoding.bank.config.dummy.DummyObject;
import shop.mtcoding.bank.domain.user.UserRepository;
import shop.mtcoding.bank.dto.user.UserRequestDto.LoginRequestDto;

@AutoConfigureMockMvc
@SpringBootTest(webEnvironment = WebEnvironment.MOCK)
public class JwtAuthenticationFilterTest extends DummyObject {

     @Autowired
     private ObjectMapper om;
     @Autowired
     private MockMvc mvc;
     @Autowired
     private UserRepository userRepository;

     @BeforeEach
     public void setUp() throws Exception {
          userRepository.save(newUser("ssar", "쌀"));

     }

     @Test
     public void successfulAuthentication_test() throws Exception {
          // given
          LoginRequestDto loginRequestDto = new LoginRequestDto();
          loginRequestDto.setUsername("ssar");
          loginRequestDto.setPassword("1234");
          String reqeustBody = om.writeValueAsString(loginRequestDto);
          System.out.println("테스트 : " + reqeustBody);

          // when
          ResultActions resultActions = mvc
                    .perform(post("/api/login").content(reqeustBody).contentType(MediaType.APPLICATION_JSON));
          String reasponseBody = resultActions.andReturn().getResponse().getContentAsString();
          System.out.println("테스트 : " + reasponseBody);

          // then

     }

     @Test
     public void unsuccessfulAuthentication_test() throws Exception {
          // given

          // when

          // then

     }
}

잡지식, test.yml

SQL 문을 이쁘게 format 해줌

  • test.yml TRACE 확인을 위한 테스트 코드 추가
@ActiveProfiles("test") // 여기
@AutoConfigureMockMvc
@SpringBootTest(webEnvironment = WebEnvironment.MOCK)
public class JwtAuthenticationFilterTest extends DummyObject {

TRACE가 있으면 어떤 값들이 들어왔는지 알 수 있다. 따라서 TEST 할때는 TRACE를 추가하자.

이렇게 결과가 나왔다는 것은,

여기서 토큰이 만들어지고

위에 사진에서 실행이 됬다는 것은 UserDetailsService가 실행이 잘 되어서 LoginUser를 리턴하고 Authentication이 잘 만들어진 것이다.

디버그를 해보면 잘 나왔을 것이다.

  • 최종 코드
@Test
     public void successfulAuthentication_test() throws Exception {
          // given
          LoginRequestDto loginRequestDto = new LoginRequestDto();
          loginRequestDto.setUsername("ssar");
          loginRequestDto.setPassword("1234");
          String reqeustBody = om.writeValueAsString(loginRequestDto);
          System.out.println("테스트 : " + reqeustBody);

          // when
          ResultActions resultActions = mvc
                    .perform(post("/api/login").content(reqeustBody).contentType(MediaType.APPLICATION_JSON));
          String reasponseBody = resultActions.andReturn().getResponse().getContentAsString();
          String jwtToken = resultActions.andReturn().getResponse().getHeader(JwtValueObject.HEADER);
          System.out.println("테스트 : " + reasponseBody);
          System.out.println("테스트 : " + jwtToken);

          // then
          resultActions.andExpect(status().isOk());
          assertNotNull(jwtToken);
          assertTrue(jwtToken.startsWith(JwtValueObject.TOKEN_PREFIX));
          resultActions.andExpect(jsonPath("$.data.username").value("ssar"));
     }
profile
블로그 이전 : https://medium.com/@jaegeunsong97

0개의 댓글