본문 바로가기

개발 일지/TIL

[ #44 ] TIL

✏️ 0618      


Spring 심화 강의

개인과제 피드백 및 재제출


Controller 는 어떻게 테스트할까?

 

@WebMvcTest(
        controllers = {UserController.class, ProductController.class},
        excludeFilters = {
                @ComponentScan.Filter(
                        type = FilterType.ASSIGNABLE_TYPE,
                        classes = WebSecurityConfig.class
                )
        }
)

 

@WebMvcTest 을 통해 controller 쪽을 테스트 할 수 있다

 

controllers 를 통해 테스트할 컨트롤러를 여러개 지정할 수 있고,

excludeFilters 를 통해 제외할 파일을 설정할 수 있다

 

@WebMvcTest(UserController.class)

 

요러케 간단하게도 테스트할 Controller 를 지정할 수 있다

 

 

private MockMvc mvc;
private Principal mockPrincipal;

@Autowired
private WebApplicationContext context;

@BeforeEach
public void setup() {
    mvc = MockMvcBuilders.webAppContextSetup(context)
            .apply(springSecurity(new MockSpringSecurityFilter()))
            .build();
}

 

가짜 객체외 가짜 인증할 객체도 선언

위의 설정에서 시큐리티 파일 설정을 취소했으니 가짜 인증 객체 만든 거 넣어주기

 

 

 

로그인 테스트 진행 시

main 에서 @EnableJpaAuditing 때문에 JPA 오류가 발생하고 있다

 

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

 

이걸 해결하기위해서 JPAConifg 파일을 추가하고 main 쪽 @EnableJpaAuditing 를 삭제하고

새로 추가한 JPAConifg 쪽에 넣어준다

 

 


controller 테스트는 @WebMvcTest 을 통해 설정을 할 수 있고
시큐리티가 설정되어 있기 때문에 가짜 시큐리티가 필요하며
mvc 를 통해 http 요청으로 가짜로 보낼수있는데 객체는 이런식으로 만드는 방법이다 라는걸 알 수 있다

 

 

 

먼가 좋은 단축키 발견

 

사실 뭐에 쓰는 건지 모르겠는데 좋아보여 !

+ㅁ+ !!

 

Ctrl + Shift + E

 

대충 코드 아무대나 위치해두고 단축키 누르면

 

 

요렇게 뜬당

 

해당 코드에 대한 관련된 코드인가 싶었는데 찾아보니까

최근 수정했던 파일 목록 보기 였다

전혀 잘 못 집었고~~

 

 

개인과제 피드백

 

피...드....배액..

 

@BeforeEach
void setUp() {
    signupReqDto = SignupRequestDto.builder()
            .userId("dds12")
            .password("asdf12")
            .name("asd1f")
            .email("email")
            .intro(" ")
            .build();

    ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
    validator = factory.getValidator();

    Locale.setDefault(Locale.KOREAN);
}

 

우선 실행되기전에 Locale 언어를 설정해주었다

검색하니까 금방 나오더라

 

애플리케이션이 실행되는 환경의 기본 Locale 이 한국어가 아닌 경우,

날짜, 시간, 숫자, 통화 등의 포맷이 한국어 형식이 아닌 다른 형식으로 표시될 수 있으니

테스트를 통해 설정 가능하다

 

 

ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
validator = factory.getValidator();

 

Validation.buildDefaultValidatorFactory() 을 호출해 기본 설정을 사용하는 ValidatorFactory 인스턴스를 생성하고

factory.getValidator() 를 호출해서 Validator 인스턴스를 생성한다

 

 

SignupRequestDto 쪽에 걸어둔 Validation 에 모두 걸리는 데이터를 대충 집어넣어주고

테스트 코드를 작성해보았다

 

@Test
@DisplayName("Signup Validation Test")
void test1() {
    // given

    // when
    Set<ConstraintViolation<SignupRequestDto>> violations = validator.validate(signupReqDto);
    List<String> messageList = new ArrayList<>();

    for (ConstraintViolation<SignupRequestDto> violation : violations) {
        String message = violation.getMessage();
        messageList.add(message);
    }

    // then
    assertThat(messageList).containsOnly(
            "유효한 이름을 입력해주세요.",
            "유효한 닉네임을 입력해주세요.",
            "소개글 입력은 필수입니다.",
            "비밀번호는 최소 10자 이상 입니다.",
            "비밀번호는 대소문자 포함 영문, 숫자, 특수문자를 최소 1글자씩 포함해야 합니다.",
            "비밀번호는 대소문자 포함 영문, 숫자, 특수문자를 최소 1글자씩 포함해야 합니다."
    );
}

 

그렇게 완성된 코드

나오는 모든 메세지를 각각 검사하기엔 번거로운 것 같아서 여러 메세지를 한번에 검사하기 위해 리스트로 만들었다

 

Set<ConstraintViolation<SignupRequestDto>> violations = validator.validate(signupReqDto);

 

validator.validate(signupReqDto) 를 호출하여 signupReqDto 객체에 대해 유효성 검사를 수행한다

유효성 검사 결과는 ConstraintViolation 객체의 집합으로 반환한다

 

 

assertThat(messageList).containsOnly( );

 

containsOnly 메서드는 리스트에 있는 요소들이 정확히 일치하며 순서는 고려하지 않는다

검사하다 보니까 출력되는 메세지가 순서가 바뀌는 것 같아서 이걸 어떻게 검사하지 고민하다가 해당 메서드를 발견했다

 

 

물론 반대되는

assertThat(messageList).containsExactly( );

 

containsExactly 메서드도 있다

이건 리스트에 있는 요소들이 정확하게 일치하며 순서도 일치해야 통과하는 메서드다

 

그래도 자꾸 틀렸다고 오류가 난다면 그땐 눈에 잘 보이지 않는 띄어쓰기를 주의하자....

띄어쓰기 하나 잘 못 복사해서 10분동안 오류 찾아봤던 1인....

 

 

Assert 메서드

 

@Test
void test() {
    int num1 = 4;
    int num2 = 5 - 1;
    assertEquals(num1, num2);
}

assertEquals : 값 비교

 

@Test
void test() {
    String str1 = "hello";
    String str2 = "hello";

    assertSame(str1, str2);
}

assertSame : 객체 비교

 

@Test
void test() {
    int num1 = 3;
    int num2 = 4;

    assertTrue(num1 < num2);
    assertFalse(num1 > num2);
}

assertTrue / assertFalse : 조건 검증

 

@Test
void test() {
    String str1 = "world";
    String str2 = null;

    assertNotNull(str1);
    assertNull(str2);
}

assertNotNull / asserNull : Null 검증

 

@Test
void test() {
    assertThrows(ArithmeticException.class, () -> {
        int result = 1 / 0;
    });
}

assertThrows : 예외 검증

 

@Test
@DisplayName("User Create Test - 실패")
void test1() {
    // given
    User user = mock(User.class);
    when(userRepository.findByUserId(anyString())).thenReturn(Optional.of(user));

    // when
    UserServiceException exception = assertThrows(UserServiceException.class, ()
            -> userService.createUser(requesignupRequestDto, file)
    );

    // then
    assertEquals("이미 중복된 사용자가 존재합니다.", exception.getMessage());
}

 

예외 검증은 이런 식으로 활용할 수 있다

 

 

회고

 

낼부터 아웃소싱 팀과제..!!

화이팅하자 화이팅...

'개발 일지 > TIL' 카테고리의 다른 글

[ #46 ] TIL  (0) 2024.06.20
[ #45 ] TIL  (0) 2024.06.19
[ #43 ] TIL  (0) 2024.06.17
[ #42 ] TIL  (0) 2024.06.14
[ #41 ] TIL  (0) 2024.06.13