Spring TestCode 작성 예시

song yuheon·2023년 9월 20일
0

Spring

목록 보기
84/93
post-thumbnail

Repository


**
 * @DataJpaTestSpring Boot에서 제공하는 애너테이션
 * JPA 구성요소만을 로드하여 데이터 접근 계층의 테스트에 초점을 맞춘 테스트를 수행하게 해준다.
 * 즉 이 애너테이션은 JPA 관련 구성을 스캔하고 빈(bean)으로 등록하여 테스트 컨텍스트를 작성하게 한다.
 * @DataJpaTest는 H2, HSQL, Derby와 같은 내장 데이터베이스를 사용하려고 시도한다.
 * @AutoConfigureTestDatabase 애너테이션을 사용하여 이러한 동작을 변경할 수 있다.
 * Plus showSql 속성을 true로 설정하면, SQL 쿼리가 로그로 출력한다.
 */
@DataJpaTest(showSql = true)
@Sql("/sql/userRepositoryTestData.sql")
public class UserRepositoryTest {
    @Autowired
    private UserRepository userRepository;

    @Test
    void UserRepository_연결_확인(){
        //given
        User user = new User();
        user.setId(22L);
        user.setUsername("bin0017");
        user.setPassword("Bin@12345");
        user.setNickName("nickname");
        user.setRole(UserRoleEnum.USER);

        //when
        User result = userRepository.save(user);

        //then
        assertThat(result).isNotNull();

    }

    @Test
    void UserRepository_findByUsername_User_객체_반환_동작_확인(){
        //given
        //when
        Optional<User> result = userRepository.findByUsername("bin0016");

        //then
        assertThat(result.isPresent()).isTrue();

    }


    @Test
    void UserRepository_findByUsername_User_객체가_없으면_Optional_empty_반환_동작_확인(){
        //given
        //when

        Optional<User> result = userRepository.findByUsername("bin00221");

        //then
        assertThat(result.isEmpty()).isTrue();

    }
}

Service


**
 * @SpringBootTestSpring Boot 테스트 프레임워크의 일부
 * Spring Boot 애플리케이션의 통합 테스트를 쉽게 작성하고 수행할 수 있도록 돕는 어노테이션이당.
 * 이 어노테이션을 사용하면 Spring Boot 애플리케이션의 전체 컨텍스트가 로드되며,
 * 그 결과 애플리케이션의 모든 구성 요소가 실제 실행 환경과 거의 동일한 방식으로 작동하는 테스트 환경이 생성된다.. 그럼 테스트 속도 느려진다.
 * 쓰는 이유 = h2인라인 DB -> 실제 DB 영향 축소된다.
 * 외부 시스템과 통합을 막기 위해
 * 다양한 환경에 대해 테스트 가능 <- 다양한 구성을 통해서
 */
@SpringBootTest
/**
 * 테스트 환경에서 쓸 설정 파일 지정
 */
@TestPropertySource("classpath:test-application.properties")
/**
 * 각 테스트 시작에 데이터 생성
 * 테스트 종료 이후 데이터 삭제
 */
@SqlGroup({
        @Sql(value="/sql/userServiceTestData.sql",executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD),
        @Sql(value="/sql/userServiceTestDataDelete.sql",executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD)
})
class UserServiceTest {
    @Autowired
    private UserRepository userRepository;

    @Autowired
    private UserService userService;

//    @Test
//    @WithMockUser(username="bin01034", roles="USER")
//    void escapeTest() {
//        // given
//        User user = new User();
//        user.setId(103L);
//        user.setUsername("bin01034");
//        user.setPassword("Bin@12345");
//        user.setNickName("nickname");
//        user.setRole(UserRoleEnum.USER);
//        userRepository.save(user);
//
//        // when
//        ResponseEntity<MessageDto> result =userService.escape();
//
//        // then
//        assertThat(result).isEqualTo(new ResponseEntity<>(new MessageDto("회원 삭제 성공"), null, HttpStatus.OK));
//    }

    @Test
    public void 유저_이름이_중복된_유저를_보면_예외를_던진다() {
        // given
        String name="bin0017";

        // when
        // then
        assertThrows(DuplicateUsernameException.class, () -> userService.userNameCheck(name));
    }

    @Test
    public void 유저_이름이_중복되지_않는_유저를_보면_아무것도_안_던진다() {
        // given
        String name="bin0099";

        // when
        // then
        assertDoesNotThrow(() -> userService.userNameCheck(name));
    }

    @Test
    public void getUserRoleEnum_관리자가_아닌_유저일때_유저반환() {
        // given
        SignupRequestDto requestDto= SignupRequestDto.builder()
                .username("bin0017")
                .password1("Bin@12345")
                .password2("Bin@12345")
                .nickName("nickname")
                .admin(false)
                .adminToken("").build();


        // when
        UserRoleEnum result = userService.getUserRoleEnum(requestDto);

        // then
        assertThat(result).isEqualTo(UserRoleEnum.USER);
    }

    @Test
    public void getUserRoleEnum_관리자인데_토큰이_일치하지_않을때_예외_반환() {
        // given
        SignupRequestDto requestDto= SignupRequestDto.builder()
                .username("bin0017")
                .password1("Bin@12345")
                .password2("Bin@12345")
                .nickName("nickname")
                .admin(true)
                .adminToken("").build();

        // when
        // then
        assertThrows(IllegalArgumentException.class, () -> userService.getUserRoleEnum(requestDto));
    }

    @Test
    public void getUserRoleEnum_관리자인데_관리자_토큰이_일치할때_관리자_반환() {
        // given
        SignupRequestDto requestDto= SignupRequestDto.builder()
                .username("bin0017")
                .password1("Bin@12345")
                .password2("Bin@12345")
                .nickName("nickname")
                .admin(true)
                .adminToken("AAABnvxRVklrnYxKZ0aHgTBcXukeZygoC").build();


        // when
        UserRoleEnum result = userService.getUserRoleEnum(requestDto);

        // then
        assertThat(result).isEqualTo(UserRoleEnum.ADMIN);
    }





    @Test
    void passwordCheck_패스워드가_일치할때() {
        //given
        SignupRequestDto requestDto= SignupRequestDto.builder()
                .username("bin0017")
                .password1("Bin@12345")
                .password2("Bin@12345")
                .nickName("nickname")
                .admin(true)
                .adminToken("AAABnvxRVklrnYxKZ0aHgTBcXukeZygoC").build();

        //when
        //then
        assertDoesNotThrow(() -> userService.passwordCheck(requestDto));
    }

    @Test
    void passwordCheck_패스워드가_불일치할때() {
        //given
        SignupRequestDto requestDto= SignupRequestDto.builder()
                .username("bin0017")
                .password1("Bin@12345")
                .password2("Bin@12346")
                .nickName("nickname")
                .admin(true)
                .adminToken("AAABnvxRVklrnYxKZ0aHgTBcXukeZygoC").build();

        //when
        //then
        assertThrows(IllegalArgumentException.class,() -> userService.passwordCheck(requestDto));
    }

    @Test
    void signup_회원가입_되는지_확인() {
        //given
        SignupRequestDto requestDto= SignupRequestDto.builder()
                .username("bin0036")
                .password1("Bin@12345")
                .password2("Bin@12345")
                .nickName("nickname3")
                .admin(true)
                .adminToken("AAABnvxRVklrnYxKZ0aHgTBcXukeZygoC").build();

        //when
        ResponseEntity<MessageDto> result =userService.signup(requestDto);
        System.out.println("--------------------");
        //then
        assertThat(result).isEqualTo(new ResponseEntity<>(new MessageDto("회원가입 성공"), null, HttpStatus.OK));
    }


//
//    @Test
//    void update() {
//    }
    // update(), escape() 둘다 회원정보를 인증객체에서 가지고 오기에 ......

    @Test
    void getUser_검색한_유저_반환_확인() {
        // given
        Long id = 21L;

        // when
        User result = userService.getUser(id);

        // then
        assertThat(result).isNotNull();
    }

    @Test
    void getUser_검색한_유저_없을때_예외_반환확인() {
        // given
        Long id = 20L;
        // when
        // then
        assertThrows(IllegalArgumentException.class,()->userService.getUser(id));
    }



}

Controller


@SpringBootTest
@AutoConfigureTestDatabase
@TestPropertySource("classpath:test-application.properties")
@AutoConfigureMockMvc
@SqlGroup({
        @Sql(value="/sql/userServiceTestData.sql",executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD),
        @Sql(value="/sql/userServiceTestDataDelete.sql",executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD)
})
class UserControllerTest {
    @Autowired
    private MockMvc mockMvc;

    private final ObjectMapper objectMapper = new ObjectMapper();

    @Test
    void 사용자_회원가입_성공() throws Exception {
        // given
        SignupRequestDto requestDto = SignupRequestDto.builder()
                .username("bin0222")
                .password1("Bin@12345")
                .password2("Bin@12345")
                .nickName("nickname")
                .build();
        // when
        // then

        mockMvc.perform(post("/api/auth/signup")
                        .contentType(MediaType.APPLICATION_JSON)
                        .content(objectMapper.writeValueAsString(requestDto)))
                .andExpect(status().isOk())
                .andDo(print());
//                .andExpect(jsonPath("$.msg").value("회원가입이 완료되었습니다."));

    }

    @Test
    void escape() {
    }

    @Test
    void update() {
    }
}

profile
backend_Devloper

0개의 댓글