본문 바로가기
320x100
320x100

Q-1. @Mock, @MockBean, @Spy, @SpyBean, @InjectMocks 의 차이를 한번 정리해 봅시다.

Annotation들

Annotation Package Target Action
Mock org.mockito Object(PlainOldJavaObject, Java Bean) Mocking - 가짜 객체
MockBean org.springframework.boot Spring Bean(ApplicationContext) Mocking - 가짜 스프링 빈
Spy org.mockito Object(PlainOldJavaObject, Java Bean) Real - 실제 객체(부분 모킹)
SpyBean org.springframework.boot Spring Bean(ApplicationContext) Real - 실제 빈(부분 모킹)
InjectMocks org.mockito @Mock or @Spy Object  Mock/Spy DI

 

Q-2. 아래 3개의 테스트가 있습니다. 내용을 살펴보고, 각 항목을 @BeforeEach, given절, when절에 배치한다면 어떻게 배치하고 싶으신가요? (@BeforeEach에 올라간 내용은 공통 항목으로 합칠 수 있습니다. ex. 1-1과 2-1을 하나로 합쳐서 @BeforeEach에 배치)

✔️ 게시판 게시물에 달리는 댓글을 담당하는 Service Test
✔️ 댓글을 달기 위해서는 게시물과 사용자가 필요하다.
✔️ 게시물을 올리기 위해서는 사용자가 필요하다.

Q-2

체크리스트에서 확인할 수 있는 것처럼 먼저 이 테스트의 주된 관심사는 댓글(Comment)이라고 생각했다

댓글이 작성되기 위해서는 사용자, 게시물이 필요하다

또한 이 테스트에서 변하지 않는 부분과 변하는 부분을 나눠봤다(영원한 불변은 없지만, 이 테스트 한정)

변하지 않는 부분: 사용자A 생성 -> 사용자A 게시물 생성

변하는 부분: 사용자B 추가

 

그럼 이제 정리됐다

package com.boki.cafekiosk.boki;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

public class CommentServiceTest {

    @BeforeEach
    void setUp() {
        1-1. 사용자A 생성에 필요한 내용 준비
        1-2. 사용자 생성
        1-3. 게시물A 생성에 필요한 내용 준비
        1-4. 게시물 생성

        2-1. 사용자A 생성에 필요한 내용 준비
        2-2. 사용자 생성
        2-3. 게시물A 생성에 필요한 내용 준비
        2-4. 게시물 생성

        3-1. 사용자A 생성에 필요한 내용 준비
        3-2. 사용자A 생성
        3-5. 사용자A의 게시물 생성에 필요한 내용 준비
        3-6. 사용자A의 게시물 생성
    }

    @DisplayName("사용자가 댓글을 작성할 수 있다.")
    @Test
    void writeComment() {
        // given
        1-5. 댓글 생성에 필요한 내용 준비

        // when
        1-6. 댓글 생성

        // then
        검증
    }

    @DisplayName("사용자가 댓글을 수정할 수 있다.")
    @Test
    void updateComment() {
        // given
        2-5. 댓글 생성에 필요한 내용 준비
        2-6. 댓글 생성

        // when
        2-7. 댓글 수정

        // then
        검증
    }

    @DisplayName("자신이 작성한 댓글이 아니면 수정할 수 없다.")
    @Test
    void cannotUpdateCommentWhenUserIsNotWriter() {
        // given
        3-3. 사용자B 생성에 필요한 내용 준비
        3-4. 사용자B 생성
        3-7. 사용자A의 댓글 생성에 필요한 내용 준비
        3-8. 사용자A의 댓글 생성

        // when
        3-9. 사용자B가 사용자1의 댓글 수정 시도

        // then
        검증
    }
}

아마 요정도로 할 것 같고.. 회사 팀 내 컨벤션에 따라 사용자A를 생성하고, 사용자A가 게시글을 생성하는 부분까지 각 테스트의 // given절로 내릴 수 있을 것 같다

 

추가로 3번째에 Authorization(권한)을 검사하는 부분에 있어서는 사용자B의 변수명을 other라고 해서 명확하게 다른 사람이 조작하는 것을 나타낼 것 같다

320x100

'Course > 인프런 워밍업 클럽 스터디' 카테고리의 다른 글

4주차 회고 발자국 🐾  (11) 2024.10.27
3주차 회고 발자국 🐾  (0) 2024.10.23
Mission - Day 15  (1) 2024.10.22

댓글