[워밍업 클럽 4기 백엔드] Day 18 미션

[워밍업 클럽 4기 백엔드] Day 18 미션

1. Mock 관련 어노테이션 정리하기

📌@Mock

  • Mockito에서 제공하는 어노테이션

  • 실제 객체를 생성하지 않고, 가짜 객체를 생성하여 해당 객체의 행위에 대한 반환값 조작 및 메서드 호출을 확인할 수 있다.

  • 만약 메서드를 stubbing 하지 않으면 기본값이 반환된다.(String : "", int : 0)

  • 단위 테스트를 수행할 때 적합하다.

  • 객체 생성 비용이 많이 발생하거나, 기능 수행 비용이 많이 발생하는 경우(외부 API 호출, 메일 전송 등)에 사용하면 테스트의 효용성을 높일 수 있다.

📌@MockitoBean

  • Spring Boot가 제공해주던 @MockBean 이 deprecated되고, Spring 프레임워크에서 기능이 같은 @MockitoBean 을 제공해준다.

  • Spring Context에 가짜 객체를 등록한다.

    • @SpringBootTest 와 같이 사용되어야 한다.

    • Spring DI 로 의존성을 주입해준다.

  • 통합 테스트를 수행할 때 적합하다.

  • @Mock 과 기능은 동일하다.

📌@Spy

  • Mockito에서 제공하는 어노테이션

  • 실제 객체를 감싸서 Spy 객체를 만든다.

  • stubbing 하지 않은 메서드는 실제 객체의 메서드의 기능이 작동된다.

    • 특정 기능의 반환값을 조작하고 싶다면 stubbing을 꼭 해줘야 한다.

  • 일부 동작만 stubbing하고, 나머지는 실제 동작을 테스트하고 싶을 때 유용하다.

  • 단위 테스트를 수행할 때 적합하다.

📌 @MockitoSpyBean

  • Spring Boot가 제공해주던 @SpyBean 이 deprecated되고, Spring 프레임워크에서 기능이 같은 @MockitoSpyBean 을 제공해준다.

  • Spring Context에 등록된 기존 빈을 감싸서 Spy 객체로 만든다.

    • @SpringBootTest 와 같이 사용되어야 한다.

    • Spring DI 로 의존성을 주입해준다.

  • 통합 테스트를 수행할 때 적합하다.

  • @Spy 와 기능은 동일하다.

📌 @InjectMocks

  • Mockito에서 제공하는 어노테이션

  • 테스트 할 대상 객체를 생성하고, 이 객체에 필요한 의존성 (@Mock@Spy 로 생성된 객체)을 자동으로 주입해준다.


2. 각 항목을 적절한 위치에 배치하기

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

@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. 사용자2 생성에 필요한 내용 준비
    3-4. 사용자2 생성

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

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

💡고려 사항

  • 댓글 관련 기능을 테스트하므로 이와 관련 없는 사용자, 게시물 생성을 테스트 코드에서 분리하고, 독립성에도 문제가 없기 때문에 공유 변수로 설정

  • 댓글은 테스트의 주체이므로 각 메서드 내부에서 생성하여 테스트 간 독립성을 보장

  • cannotUpdateCommentWhenUserIsNotWriter() 사용자2 데이터는 해당 메서드에서만 사용하기 때문에 분리할 필요가 없다고 판단

     

  • 사용자1과 다른 사용자2가 있다는 것을 명시적으로 테스트 코드에 보여주어야 무엇을 테스트 하는지 이해를 도울 수 있다고 판단

  • 3-9는 예외를 검증하는 코드이므로 assertThatThrownBy() 을 사용할 것으로 생각되어 when, then 절에 배치

 

출처 : Practical Testing: 실용적인 테스트 가이드

댓글을 작성해보세요.

채널톡 아이콘