게시물을 만드는 프로젝트를 진행하다보니 유저나 포스트의 내용을 비교하는 일이 많아졌다.
예를 들어
public User userDBCheck(String userName){
return userRepository.findByUserName(userName)
.orElseThrow(() -> new AppException(ErrorCode.USERNAME_NOT_FOUND));
}
public Post postDBCheck(Long id){
return postRepository.findById(id)
.orElseThrow(() -> new AppException(ErrorCode.DATABASE_ERROR));
}
위와 같이 여러곳에서 중복적으로 사용하는 코드는 코드 중복을 방지하기 위해 Exception Class를 통해 중복되는 코드를 분리시켜 호출하여 사용하는 방식으로 구현을 했다.
하지만 PostMan을 통해 동작을 했을때는 정상적으로 동작을 하지만 Junit에서 Test를 할때는 오류가 발생했다.
// 1. 포스트 새로 작성
public PostCreateResponse postCreate(PostCreateRequest postCreateRequest, String userName){
User user = userException.userDBCheck(userName);
Post post = postRepository.save(postCreateRequest.toEntity(user)); // Post DB에 유저가 입력한 제목,내용 저장
if(post == null){
return PostCreateResponse.error(); // DB에서 오류가 발생하여 post값을 받아오지 못하면 "저장실패" 오류 출력
}else {
return PostCreateResponse.success(post.getId()); // 정상동작시 "등록 완료" 출력
}
}
public Post postDBCheck(Long id){
return postRepository.findById(id)
.orElseThrow(() -> new AppException(ErrorCode.DATABASE_ERROR));
}
@Test
@DisplayName("1. 포스트 등록 실패 - 로그인 안함")
void postCreate_fail(){
when(userException.optionalUserDBCheck(userName))
.thenReturn(Optional.empty()); // userName을 통해 DB에서 해당 데이터를 찾았지만 없을 경우 상황 설정
when(postRepository.save(any()))
.thenReturn(PostEntityFixture.postEntity("han","1234")); // 포스트 데이터 저장
PostCreateRequest request = new PostCreateRequest(title,body);
AppException exception = Assertions.assertThrows(AppException.class,() -> postService.postCreate(request,userName)); // userName을 통해 찾은 데이터가 없으므로 예외처리가 발생함
assertEquals(ErrorCode.USERNAME_NOT_FOUND, exception.getErrorCode());
}
public PostCreateResponse postCreate(PostCreateRequest postCreateRequest, String userName){
User user = userException.optionalUserDBCheck(userName)
.orElseThrow(() -> new AppException(ErrorCode.USERNAME_NOT_FOUND,String.format("해당 유저가 없습니다.")));
Post post = postRepository.save(postCreateRequest.toEntity(user)); // Post DB에 유저가 입력한 제목,내용 저장
if(post == null){
return PostCreateResponse.error(); // DB에서 오류가 발생하여 post값을 받아오지 못하면 "저장실패" 오류 출력
}else {
return PostCreateResponse.success(post.getId()); // 정상동작시 "등록 완료" 출력
}
}
public Optional<User> optionalUserDBCheck(String userName){
return userRepository.findByUserName(userName);
}
@Test
@DisplayName("1. 포스트 등록 실패 - 로그인 안함")
void postCreate_fail(){
when(userException.optionalUserDBCheck(userName))
.thenReturn(Optional.empty()); // userName을 통해 DB에서 해당 데이터를 찾았지만 없을 경우 상황 설정
when(postRepository.save(any()))
.thenReturn(PostEntityFixture.postEntity("han","1234")); // 포스트 데이터 저장
PostCreateRequest request = new PostCreateRequest(title,body);
AppException exception = Assertions.assertThrows(AppException.class,() -> postService.postCreate(request,userName)); // userName을 통해 찾은 데이터가 없으므로 예외처리가 발생함
assertEquals(ErrorCode.USERNAME_NOT_FOUND, exception.getErrorCode());
}