[인프런 워밍업클럽 백엔드 4기] Day18미션

image

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

    1. Mock

      1. 해당 클래스 혹은 인터페이스의 목 인스턴스를 생성한다. stub을 통해 사용되는 케이스에 대해 반환값을 지정해주어야한다.

    2. MockBean

      1. 해당 인터페이스 혹은 클래스의 목 인스턴스를 생성하고 스프링 빈 중 해당 클래스, 인터페이스의 빈이 필요할 경우 주입한다.

    3. Spy

      1. 해당 클래스의 구현체를 기반으로 스파이 인스턴스를 생성한다.

        1. 기본적으로 위임을 통해 기존로직들을 수행하고 추가적으로 stub이 가능하다.

    4. SpyBean

      1. 해당 인터페이스 혹은 클래스의 스파이 인스턴스를 생성하고 스프링 빈 중 해당 클래스, 인터페이스의 빈이 필요할 경우 주입한다.

    5. InjectMocks

      1. 해당 클래스의 생성자에 필요한 멤버들을 mock으로 주입한다.

 

2.

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


  @DisplayName("사용자가 댓글을 작성할 수 있다.")
  @Test
  void writeComment() {
    // given

    1 - 5. 댓글 생성에 필요한 내용 준비

    // when
    1 - 6. 댓글 생성

    // then
    검증
  }

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

    // when
    2 - 7. 댓글 수정

    // then
    검증
  }

  @DisplayName("자신이 작성한 댓글이 아니면 수정할 수 없다.")
  @Test
  void cannotUpdateCommentWhenUserIsNotWriter() {
    // given

    3 - 7. 사용자1의 댓글 생성에 필요한 내용 준비
    3 - 8. 사용자1의 댓글 생성

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

    // then
    검증
  }

각 테스트의 공통요소들을 BeforeEach에 배정해도 좋지만 DRY한 코드를 작성함으로써

각 테스트를 볼 때 한눈에 플로우를 파악할 수 없게 된다. 따라서 컴포넌트등의 초기화를 할 때 사용하고,
엔티티,VO 클래스의 경우 Fixture를 통해 생성하고 필요시 메소드로 동작을 명시한다.

----------------------------
우빈님의 줌 밋업 이후 변경한 사항으로, 맥락에 필요 없는 내용은 BeforeEach로 분리합니다.

댓글을 작성해보세요.

채널톡 아이콘