항해99

23.10.27 항해 99 16기 실전 프로젝트 21일차

김용글 2023. 10. 27. 22:04

오늘 공부한 것

* 댓글 및 대댓글 Service 테스트 코드 작성

 

오늘은 기술면접 롤플레잉도했고 남는 시간에 계속 테스트 코드를 작성했다

 

결론적으론 댓글 및 대댓글의 POST, PUT, DELETE 메서드에 대한 테스트 코드는 모두 작성했으며

GET 메서드는 아직 작성하지 못했다.

 

테스트용 데이터가 없어서 에러가 나기도하고 참 많은 일이 있던 하루였지만 다행히 잘마쳤다

내일은 GET 메서드에 대한 테스트 코드에 도전해봐야겠다 아무래도 조회가 되는 부분이다보니

오늘 한것보다 조금은 복잡할 것으로 예상된다

 

또한 내일은 드디어 중간발표가 있는 날이다 오늘 우리가 만든 홈페이지를 둘러보았는데

아직 미흡한 점이 많았지만 감회가매우 새로웠다.

 

1. CommentsServiceTest

더보기
package com.sparta.team2project.comments;

import com.sparta.team2project.comments.dto.CommentsRequestDto;
import com.sparta.team2project.comments.entity.Comments;
import com.sparta.team2project.comments.repository.CommentsRepository;
import com.sparta.team2project.comments.service.CommentsService;
import com.sparta.team2project.commons.dto.MessageResponseDto;
import com.sparta.team2project.commons.entity.UserRoleEnum;
import com.sparta.team2project.commons.exceptionhandler.CustomException;
import com.sparta.team2project.commons.exceptionhandler.ErrorCode;
import com.sparta.team2project.posts.entity.PostCategory;
import com.sparta.team2project.posts.entity.Posts;
import com.sparta.team2project.posts.repository.PostsRepository;
import com.sparta.team2project.users.UserRepository;
import com.sparta.team2project.users.Users;
import jakarta.servlet.http.HttpServletResponse;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

import java.util.Optional;

import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

public class CommentsServiceTest {

    // @Mock 이 붙은 목 객체를 주입시킬 수 있다
    @InjectMocks
    private CommentsService commentsService;

    // 로직이 삭제된 빈껍데기, 실제로 메서드는 가지고 있지만 내부구현이 없음
    @Mock
    private CommentsRepository commentsRepository;

    @Mock
    private PostsRepository postsRepository;

    @Mock
    private UserRepository userRepository;

    @BeforeEach
    public void setUp() {
        MockitoAnnotations.openMocks(this);
    }

    public CommentsRequestDto McokCommentsRequestDto() {
        CommentsRequestDto commentsRequestDto = mock(CommentsRequestDto.class);
        when(commentsRequestDto.getContents()).thenReturn("댓글");
        return commentsRequestDto;
    }

    public Users MockUsers1(){
        return new Users("rkawk@email.com", "감자", "test123!", UserRoleEnum.USER, "image/profileImg.png");
    }
    public Users MockUsers2(){
        return new Users("qksksk@email.com", "바나나", "test123!", UserRoleEnum.USER, "image/profileImg.png");
    }
    public Users MockAdmin(){
        return new Users("rhksflwk@email.com", "관리자", "test123!", UserRoleEnum.ADMIN, "image/profileImg.png");
    }

    public Posts MockPosts(){
        return new Posts("해돋이 보러간다", "정동진 해돋이", PostCategory.가족, "동해안 해돋이", MockUsers1());
    }

    public Comments MockComments() {
        return new Comments(McokCommentsRequestDto(), MockUsers1(), MockPosts());
    }


    @Test
    @DisplayName("[정상 작동] 댓글 생성")
    public void commentsCreateTest() {

        // Given
        Long postId = 1L;
        CommentsRequestDto requestDto = McokCommentsRequestDto();
        Users users = MockUsers1(); // 사용자 정보 초기화
        Posts post = new Posts(); // 게시글 정보 초기화

        when(postsRepository.findById(postId)).thenReturn(Optional.of(post));
        when(commentsRepository.save(any(Comments.class))).thenReturn(new Comments());

        // When
        MessageResponseDto response = commentsService.commentsCreate(postId, requestDto, users);

        // Then
        System.out.println("댓글 생성");
        assertEquals("댓글을 작성하였습니다", response.getMsg());
        assertEquals(HttpServletResponse.SC_OK, response.getStatusCode());
    }

    @Test
    @DisplayName("[비정상 작동]댓글 생성")
    public void commentsCreatePostNotFoundTest() {

        // Given
        Long postId = 1L;
        CommentsRequestDto requestDto = McokCommentsRequestDto();
        Users users = MockUsers1(); // 사용자 정보 초기화

        when(postsRepository.findById(postId)).thenReturn(Optional.empty());

        // When
        CustomException exception = assertThrows(CustomException.class, () -> {
            commentsService.commentsCreate(postId, requestDto, users);
        });

        // Then
        System.out.println("ErrorCode.POST_NOT_EXIST: " + "존재하지 않는 게시글입니다");
        System.out.println("exception.getErrorCode(): " + exception.getErrorCode());
        assertEquals(ErrorCode.POST_NOT_EXIST, exception.getErrorCode());
    }

    @Test
    @DisplayName("[정상 작동] 본인이 쓴 댓글 수정 USER")
    public void commentsUpdateUserTest() {

        // Given
        Long commentId = 1L;
        CommentsRequestDto requestDto = McokCommentsRequestDto();
        Users users = MockUsers1(); // 사용자 정보 초기화
        Posts posts = MockPosts(); // 게시글 정보 초기화
        Comments comments = MockComments(); // 댓글 정보 초기화

        when(commentsRepository.findById(commentId)).thenReturn(Optional.of(comments));
        when(userRepository.findByEmail(users.getEmail())).thenReturn(Optional.of(posts.getUsers()));

        // When
        MessageResponseDto response = commentsService.commentsUpdate(commentId, requestDto, users);

        // Then
        System.out.println("댓글 수정");
        assertNotNull(response);
        assertEquals("댓글을 수정하였습니다", response.getMsg());
        assertEquals(HttpServletResponse.SC_OK, response.getStatusCode());
    }

    @Test
    @DisplayName("[정상 작동] 모든 댓글 수정 ADMIN")
    public void commentsUpdateAdminTest() {

        // Given
        Long commentId = 1L;
        CommentsRequestDto requestDto = McokCommentsRequestDto();
        Users users = MockUsers1(); // 사용자 정보 초기화
        Users users1 = MockAdmin(); // 사용자 정보 초기화
        Posts posts = MockPosts(); // 게시글 정보 초기화
        Comments comments = MockComments(); // 댓글 정보 초기화

        when(commentsRepository.findById(commentId)).thenReturn(Optional.of(comments));
        when(userRepository.findByEmail(users.getEmail())).thenReturn(Optional.of(posts.getUsers()));

        // When
        MessageResponseDto response = commentsService.commentsUpdate(commentId, requestDto, users1);

        // Then
        System.out.println("관리자 댓글 수정");
        assertNotNull(response);
        assertEquals("관리자가 댓글을 수정하였습니다", response.getMsg());
        assertEquals(HttpServletResponse.SC_OK, response.getStatusCode());
    }

    @Test
    @DisplayName("[비정상 작동]댓글 수정 본인이 쓴 댓글 아닌 경우")
    public void commentsUpdateNotAllowedTest() {

        // Given
        Long commentId = 1L;
        CommentsRequestDto requestDto = McokCommentsRequestDto();
        Users users2 = MockUsers2(); // 사용자 정보 초기화
        Comments comments = MockComments(); // 댓글 정보 초기화

        when(comments.getEmail()).thenReturn("다른 사용자의 이메일");
        when(commentsRepository.findById(commentId)).thenReturn(Optional.of(comments));

        // When
        CustomException exception = assertThrows(CustomException.class, () -> {
            commentsService.commentsUpdate(commentId, requestDto, users2);
        });

        // Then
        System.out.println("ErrorCode.NOT_ALLOWED: " + "권한이 없습니다");
        System.out.println("exception.getErrorCode(): " + exception.getErrorCode());
        assertEquals(ErrorCode.NOT_ALLOWED, exception.getErrorCode());
    }

    @Test
    @DisplayName("[정상 작동] 본인이 쓴 댓글 삭제 USER")
    public void commentsDeleteUserTest() {

        // Given
        Long commentId = 1L;
        Users users = MockUsers1(); // 사용자 정보 초기화
        Posts posts = MockPosts(); // 게시글 정보 초기화
        Comments comments = MockComments(); // 댓글 정보 초기화

        when(commentsRepository.findById(commentId)).thenReturn(Optional.of(comments));
        when(userRepository.findByEmail(users.getEmail())).thenReturn(Optional.of(posts.getUsers()));

        // When
        MessageResponseDto response = commentsService.commentsDelete(commentId, users);

        // Then
        System.out.println("댓글 삭제");
        assertNotNull(response);
        assertEquals("댓글을 삭제하였습니다", response.getMsg());
        assertEquals(HttpServletResponse.SC_OK, response.getStatusCode());
    }

    @Test
    @DisplayName("[정상 작동] 모든 댓글 삭제 ADMIN")
    public void commentsDeleteAdminTest() {

        // Given
        Long commentId = 1L;
        Users users = MockUsers1(); // 사용자 정보 초기화
        Users users1 = MockAdmin(); // 사용자 정보 초기화
        Posts posts = MockPosts(); // 게시글 정보 초기화
        Comments comments = MockComments(); // 댓글 정보 초기화

        when(commentsRepository.findById(commentId)).thenReturn(Optional.of(comments));
        when(userRepository.findByEmail(users.getEmail())).thenReturn(Optional.of(posts.getUsers()));

        // When
        MessageResponseDto response = commentsService.commentsDelete(commentId, users1);

        // Then
        System.out.println("관리자 댓글 삭제");
        assertNotNull(response);
        assertEquals("관리자가 댓글을 삭제하였습니다", response.getMsg());
        assertEquals(HttpServletResponse.SC_OK, response.getStatusCode());
    }

    @Test
    @DisplayName("[비정상 작동]댓글 삭제 본인이 쓴 댓글 아닌 경우")
    public void commentsDeleteNotAllowedTest() {

        // Given
        Long commentId = 1L;
        Users users2 = MockUsers2(); // 사용자 정보 초기화
        Comments comments = MockComments(); // 댓글 정보 초기화

        when(comments.getEmail()).thenReturn("다른 사용자의 이메일");
        when(commentsRepository.findById(commentId)).thenReturn(Optional.of(comments));

        // When
        CustomException exception = assertThrows(CustomException.class, () -> {
            commentsService.commentsDelete(commentId, users2);
        });

        // Then
        System.out.println("ErrorCode.NOT_ALLOWED: " + "권한이 없습니다");
        System.out.println("exception.getErrorCode(): " + exception.getErrorCode());
        assertEquals(ErrorCode.NOT_ALLOWED, exception.getErrorCode());
    }
}

 

2. RepliesServiceTest

더보기
package com.sparta.team2project.replies;

import com.sparta.team2project.comments.dto.CommentsRequestDto;
import com.sparta.team2project.comments.entity.Comments;
import com.sparta.team2project.comments.repository.CommentsRepository;
import com.sparta.team2project.commons.dto.MessageResponseDto;
import com.sparta.team2project.commons.entity.UserRoleEnum;
import com.sparta.team2project.commons.exceptionhandler.CustomException;
import com.sparta.team2project.commons.exceptionhandler.ErrorCode;
import com.sparta.team2project.posts.entity.PostCategory;
import com.sparta.team2project.posts.entity.Posts;
import com.sparta.team2project.replies.dto.RepliesRequestDto;
import com.sparta.team2project.replies.entity.Replies;
import com.sparta.team2project.replies.repository.RepliesRepository;
import com.sparta.team2project.replies.service.RepliesService;
import com.sparta.team2project.users.UserRepository;
import com.sparta.team2project.users.Users;
import jakarta.servlet.http.HttpServletResponse;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

import java.util.Optional;

import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

public class RepliesServiceTest {

    // @Mock 이 붙은 목 객체를 주입시킬 수 있다
    @InjectMocks
    private RepliesService repliesService;

    // 로직이 삭제된 빈껍데기, 실제로 메서드는 가지고 있지만 내부구현이 없음
    @Mock
    private RepliesRepository repliesRepository;

    @Mock
    private CommentsRepository commentsRepository;

    @Mock
    private UserRepository userRepository;

    @BeforeEach
    public void setUp() {
        MockitoAnnotations.openMocks(this);
    }

    public CommentsRequestDto McokCommentsRequestDto() {
        CommentsRequestDto commentsRequestDto = mock(CommentsRequestDto.class);
        when(commentsRequestDto.getContents()).thenReturn("댓글");
        return commentsRequestDto;
    }

    public RepliesRequestDto McokRepliesRequestDto() {
        RepliesRequestDto repliesRequestDto = mock(RepliesRequestDto.class);
        when(repliesRequestDto.getContents()).thenReturn("대댓글");
        return repliesRequestDto;
    }

    public Users MockUsers1() {
        return new Users("rkawk@email.com", "감자", "test123!", UserRoleEnum.USER, "image/profileImg.png");
    }

    public Users MockUsers2() {
        return new Users("qksksk@email.com", "바나나", "test123!", UserRoleEnum.USER, "image/profileImg.png");
    }

    public Users MockAdmin() {
        return new Users("rhksflwk@email.com", "관리자", "test123!", UserRoleEnum.ADMIN, "image/profileImg.png");
    }

    public Posts MockPosts() {
        return new Posts("해돋이 보러간다", "정동진 해돋이", PostCategory.가족, "동해안 해돋이", MockUsers1());
    }

    public Comments MockComments() {
        return new Comments(McokCommentsRequestDto(), MockUsers1(), MockPosts());
    }

    public Replies MockResplies() {
        return new Replies(McokRepliesRequestDto(), MockUsers1(), MockComments());
    }

    @Test
    @DisplayName("[정상 작동] 대댓글 생성")
    public void repliesCreateTest() {

        // Given
        Long commentId = 1L;
        RepliesRequestDto requestDto = McokRepliesRequestDto();
        Users users = MockUsers1(); // 사용자 정보 초기화
        Comments comments = new Comments(); // 게시글 정보 초기화

        when(commentsRepository.findById(commentId)).thenReturn(Optional.of(comments));
        when(repliesRepository.save(any(Replies.class))).thenReturn(new Replies());

        // When
        MessageResponseDto response = repliesService.repliesCreate(commentId, requestDto, users);

        // Then
        System.out.println("대댓글 생성");
        assertEquals("대댓글을 작성하였습니다", response.getMsg());
        assertEquals(HttpServletResponse.SC_OK, response.getStatusCode());
    }

    @Test
    @DisplayName("[비정상 작동]대댓글 생성")
    public void repliesCreatePostNotFoundTest() {

        // Given
        Long commentId = 1L;
        RepliesRequestDto requestDto = McokRepliesRequestDto();
        Users users = MockUsers1(); // 사용자 정보 초기화

        when(commentsRepository.findById(commentId)).thenReturn(Optional.empty());

        // When
        CustomException exception = assertThrows(CustomException.class, () -> {
            repliesService.repliesCreate(commentId, requestDto, users);
        });

        // Then
        System.out.println("ErrorCode.COMMENTS_NOT_EXIST: " + "존재하지 않는 댓글입니다");
        System.out.println("exception.getErrorCode(): " + exception.getErrorCode());
        assertEquals(ErrorCode.COMMENTS_NOT_EXIST, exception.getErrorCode());
    }

    @Test
    @DisplayName("[정상 작동] 본인이 쓴 대댓글 수정 USER")
    public void repliesUpdateUserTest() {

        // Given
        Long reliesId = 1L;
        RepliesRequestDto requestDto = McokRepliesRequestDto();
        Users users = MockUsers1(); // 사용자 정보 초기화
        Posts posts = MockPosts(); // 게시글 정보 초기화
        Replies replies = MockResplies();

        when(repliesRepository.findById(reliesId)).thenReturn(Optional.of(replies));
        when(userRepository.findByEmail(users.getEmail())).thenReturn(Optional.of(posts.getUsers()));

        // When
        MessageResponseDto response = repliesService.repliesUpdate(reliesId, requestDto, users);

        // Then
        System.out.println("대댓글 수정");
        assertNotNull(response);
        assertEquals("대댓글을 수정하였습니다", response.getMsg());
        assertEquals(HttpServletResponse.SC_OK, response.getStatusCode());
    }

    @Test
    @DisplayName("[정상 작동] 모든 대댓글 수정 ADMIN")
    public void repliesUpdateAdminTest() {

        // Given
        Long reliesId = 1L;
        RepliesRequestDto requestDto = McokRepliesRequestDto();
        Users users = MockUsers1(); // 사용자 정보 초기화
        Users users1 = MockAdmin(); // 사용자 정보 초기화
        Posts posts = MockPosts(); // 게시글 정보 초기화
        Replies replies = MockResplies();

        when(repliesRepository.findById(reliesId)).thenReturn(Optional.of(replies));
        when(userRepository.findByEmail(users.getEmail())).thenReturn(Optional.of(posts.getUsers()));

        // When
        MessageResponseDto response = repliesService.repliesUpdate(reliesId, requestDto, users1);

        // Then
        System.out.println("관리자 대댓글 수정");
        assertNotNull(response);
        assertEquals("관리자가 대댓글을 수정하였습니다", response.getMsg());
        assertEquals(HttpServletResponse.SC_OK, response.getStatusCode());
    }

    @Test
    @DisplayName("[비정상 작동]대댓글 수정 본인이 쓴 대댓글 아닌 경우")
    public void repliesUpdateNotAllowedTest() {

        // Given
        Long repliesId = 1L;
        RepliesRequestDto requestDto = McokRepliesRequestDto();
        Users users2 = MockUsers2(); // 사용자 정보 초기화
        Replies replies = MockResplies(); // 댓글 정보 초기화

        when(replies.getEmail()).thenReturn("다른 사용자의 이메일");
        when(repliesRepository.findById(repliesId)).thenReturn(Optional.of(replies));

        // When
        CustomException exception = assertThrows(CustomException.class, () -> {
            repliesService.repliesUpdate(repliesId, requestDto, users2);
        });

        // Then
        System.out.println("ErrorCode.NOT_ALLOWED: " + "권한이 없습니다");
        System.out.println("exception.getErrorCode(): " + exception.getErrorCode());
        assertEquals(ErrorCode.NOT_ALLOWED, exception.getErrorCode());
    }

    @Test
    @DisplayName("[정상 작동] 본인이 쓴 대댓글 삭제 USER")
    public void repliesDeleteUserTest() {

        // Given
        Long reliesId = 1L;
        Users users = MockUsers1(); // 사용자 정보 초기화
        Posts posts = MockPosts(); // 게시글 정보 초기화
        Replies replies = MockResplies();

        when(repliesRepository.findById(reliesId)).thenReturn(Optional.of(replies));
        when(userRepository.findByEmail(users.getEmail())).thenReturn(Optional.of(posts.getUsers()));

        // When
        MessageResponseDto response = repliesService.repliesDelete(reliesId, users);

        // Then
        System.out.println("대댓글 삭제");
        assertNotNull(response);
        assertEquals("대댓글을 삭제하였습니다", response.getMsg());
        assertEquals(HttpServletResponse.SC_OK, response.getStatusCode());
    }

    @Test
    @DisplayName("[정상 작동] 모든 대댓글 삭제 ADMIN")
    public void repliesDeleteAdminTest() {

        // Given
        Long reliesId = 1L;
        Users users = MockUsers1(); // 사용자 정보 초기화
        Users users1 = MockAdmin(); // 사용자 정보 초기화
        Posts posts = MockPosts(); // 게시글 정보 초기화
        Replies replies = MockResplies();

        when(repliesRepository.findById(reliesId)).thenReturn(Optional.of(replies));
        when(userRepository.findByEmail(users.getEmail())).thenReturn(Optional.of(posts.getUsers()));

        // When
        MessageResponseDto response = repliesService.repliesDelete(reliesId, users1);

        // Then
        System.out.println("관리자 대댓글 삭제");
        assertNotNull(response);
        assertEquals("관리자가 대댓글을 삭제하였습니다", response.getMsg());
        assertEquals(HttpServletResponse.SC_OK, response.getStatusCode());
    }

    @Test
    @DisplayName("[비정상 작동]대댓글 삭제 본인이 쓴 대댓글 아닌 경우")
    public void repliesDeleteNotAllowedTest() {

        // Given
        Long repliesId = 1L;
        Users users2 = MockUsers2(); // 사용자 정보 초기화
        Replies replies = MockResplies(); // 댓글 정보 초기화

        when(replies.getEmail()).thenReturn("다른 사용자의 이메일");
        when(repliesRepository.findById(repliesId)).thenReturn(Optional.of(replies));

        // When
        CustomException exception = assertThrows(CustomException.class, () -> {
            repliesService.repliesDelete(repliesId, users2);
        });

        // Then
        System.out.println("ErrorCode.NOT_ALLOWED: " + "권한이 없습니다");
        System.out.println("exception.getErrorCode(): " + exception.getErrorCode());
        assertEquals(ErrorCode.NOT_ALLOWED, exception.getErrorCode());
    }
}