Repository
**
* @DataJpaTest는 Spring 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_연결_확인(){
User user = new User();
user.setId(22L);
user.setUsername("bin0017");
user.setPassword("Bin@12345");
user.setNickName("nickname");
user.setRole(UserRoleEnum.USER);
User result = userRepository.save(user);
assertThat(result).isNotNull();
}
@Test
void UserRepository_findByUsername_User_객체_반환_동작_확인(){
Optional<User> result = userRepository.findByUsername("bin0016");
assertThat(result.isPresent()).isTrue();
}
@Test
void UserRepository_findByUsername_User_객체가_없으면_Optional_empty_반환_동작_확인(){
Optional<User> result = userRepository.findByUsername("bin00221");
assertThat(result.isEmpty()).isTrue();
}
}
Service
**
* @SpringBootTest는 Spring 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
public void 유저_이름이_중복된_유저를_보면_예외를_던진다() {
String name="bin0017";
assertThrows(DuplicateUsernameException.class, () -> userService.userNameCheck(name));
}
@Test
public void 유저_이름이_중복되지_않는_유저를_보면_아무것도_안_던진다() {
String name="bin0099";
assertDoesNotThrow(() -> userService.userNameCheck(name));
}
@Test
public void getUserRoleEnum_관리자가_아닌_유저일때_유저반환() {
SignupRequestDto requestDto= SignupRequestDto.builder()
.username("bin0017")
.password1("Bin@12345")
.password2("Bin@12345")
.nickName("nickname")
.admin(false)
.adminToken("").build();
UserRoleEnum result = userService.getUserRoleEnum(requestDto);
assertThat(result).isEqualTo(UserRoleEnum.USER);
}
@Test
public void getUserRoleEnum_관리자인데_토큰이_일치하지_않을때_예외_반환() {
SignupRequestDto requestDto= SignupRequestDto.builder()
.username("bin0017")
.password1("Bin@12345")
.password2("Bin@12345")
.nickName("nickname")
.admin(true)
.adminToken("").build();
assertThrows(IllegalArgumentException.class, () -> userService.getUserRoleEnum(requestDto));
}
@Test
public void getUserRoleEnum_관리자인데_관리자_토큰이_일치할때_관리자_반환() {
SignupRequestDto requestDto= SignupRequestDto.builder()
.username("bin0017")
.password1("Bin@12345")
.password2("Bin@12345")
.nickName("nickname")
.admin(true)
.adminToken("AAABnvxRVklrnYxKZ0aHgTBcXukeZygoC").build();
UserRoleEnum result = userService.getUserRoleEnum(requestDto);
assertThat(result).isEqualTo(UserRoleEnum.ADMIN);
}
@Test
void passwordCheck_패스워드가_일치할때() {
SignupRequestDto requestDto= SignupRequestDto.builder()
.username("bin0017")
.password1("Bin@12345")
.password2("Bin@12345")
.nickName("nickname")
.admin(true)
.adminToken("AAABnvxRVklrnYxKZ0aHgTBcXukeZygoC").build();
assertDoesNotThrow(() -> userService.passwordCheck(requestDto));
}
@Test
void passwordCheck_패스워드가_불일치할때() {
SignupRequestDto requestDto= SignupRequestDto.builder()
.username("bin0017")
.password1("Bin@12345")
.password2("Bin@12346")
.nickName("nickname")
.admin(true)
.adminToken("AAABnvxRVklrnYxKZ0aHgTBcXukeZygoC").build();
assertThrows(IllegalArgumentException.class,() -> userService.passwordCheck(requestDto));
}
@Test
void signup_회원가입_되는지_확인() {
SignupRequestDto requestDto= SignupRequestDto.builder()
.username("bin0036")
.password1("Bin@12345")
.password2("Bin@12345")
.nickName("nickname3")
.admin(true)
.adminToken("AAABnvxRVklrnYxKZ0aHgTBcXukeZygoC").build();
ResponseEntity<MessageDto> result =userService.signup(requestDto);
System.out.println("--------------------");
assertThat(result).isEqualTo(new ResponseEntity<>(new MessageDto("회원가입 성공"), null, HttpStatus.OK));
}
@Test
void getUser_검색한_유저_반환_확인() {
Long id = 21L;
User result = userService.getUser(id);
assertThat(result).isNotNull();
}
@Test
void getUser_검색한_유저_없을때_예외_반환확인() {
Long id = 20L;
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 {
SignupRequestDto requestDto = SignupRequestDto.builder()
.username("bin0222")
.password1("Bin@12345")
.password2("Bin@12345")
.nickName("nickname")
.build();
mockMvc.perform(post("/api/auth/signup")
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(requestDto)))
.andExpect(status().isOk())
.andDo(print());
}
@Test
void escape() {
}
@Test
void update() {
}
}