inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

@Mock, @MockBean, @Spy, @SpyBean, @InjectMocks의 차이

이동원
0

 

1. @Mock, @MockBean, @Spy, @SpyBean, @InjectMocks의 차이

 

@Mock

@MockBean

@Spy

@SpyBean

@InjectMocks

이 애노테이션들은 각각의 목적과 상황에 맞게 사용되며, 단위 테스트에서는 주로 @Mock@InjectMocks가 사용되고, 통합 테스트에서는 @MockBean@SpyBean이 적합한 경우가 많다. @Spy는 실제 객체의 일부만 Mocking해야 하는 상황에서 유용하다.

 

 

 

2. 테스트 코드 리팩토링

공통 항목(@BeforeEach)

테스트 코드에서 중복되는 사용자 및 게시물 생성 로직을 @BeforeEach로 이동하여 공통화할 수 있다.

 

class CommentServiceTest {

    private User user;
    private Post post;

    @BeforeEach
    void setUp() {
        // 사용자 생성에 필요한 내용 준비 및 사용자 생성
        user = createUser();

        // 게시물 생성에 필요한 내용 준비 및 게시물 생성
        post = createPost(user);
    }

    @DisplayName("사용자가 댓글을 작성할 수 있다.")
    @Test
    void writeComment() {
        // given
        Comment comment = prepareComment(post, user);

        // when
        commentService.writeComment(comment);

        // then
        assertThat(commentRepository.findById(comment.getId())).isPresent();
    }

    @DisplayName("사용자가 댓글을 수정할 수 있다.")
    @Test
    void updateComment() {
        // given
        Comment comment = prepareComment(post, user);
        commentService.writeComment(comment);

        String updatedContent = "Updated content";

        // when
        commentService.updateComment(comment.getId(), updatedContent);

        // then
        assertThat(commentRepository.findById(comment.getId()).get().getContent()).isEqualTo(updatedContent);
    }

    @DisplayName("자신이 작성한 댓글이 아니면 수정할 수 없다.")
    @Test
    void cannotUpdateCommentWhenUserIsNotWriter() {
        // given
        User anotherUser = createAnotherUser();
        Comment comment = prepareComment(post, user);
        commentService.writeComment(comment);

        String updatedContent = "Updated content";

        // when & then
        assertThrows(UnauthorizedException.class, () -> 
            commentService.updateCommentAsUser(anotherUser, comment.getId(), updatedContent)
        );
    }

    private User createUser() {
        // 사용자 생성 로직 구현
        return new User("user1", "password");
    }

    private User createAnotherUser() {
        // 다른 사용자 생성 로직 구현
        return new User("user2", "password");
    }

    private Post createPost(User user) {
        // 게시물 생성 로직 구현
        return new Post("게시물 제목", "게시물 내용", user);
    }

    private Comment prepareComment(Post post, User user) {
        // 댓글 생성 로직 구현
        return new Comment("댓글 내용", post, user);
    }
}

답변 0