💐스승의 날 댓글 남기고 선물 받기💐

워밍업 클럽 3기 Code 과정 Day 18 미션

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

 

@Mock

  • Mockito의 기본 Mock 객체 생성

  • 객체의 동작 지정 안하면 기본 값 반환

  • Spring Context 없이도 사용 가능

     

 

@MockBean

  • Spring이 관리하는 특정 Bean을 Mock 객체로 대체하는 것

  • Spring Context 내에서 효과가 있음

  • @SpringBootTest나 @WebMvcTest에서 사용

  • MockBean말고 다른 Bean들은 실제 Bean 사용 가능

  • @Autowired로 Mock 객체를 주입

 

@Spy

  • Mockito의 Spy 객체 생성

  • 특정 기능만 Mocking하고 나머지 기능은 원본 객체와 동일하게 수행

  • when().thenReturn()으로 특정 메서드의 동작만 변경 가능

  • Mock의 verify 메서드와 비슷

 

@SpyBean

  • Spring이 관리하는 특정 Bean을 Spy로 대체하는 것

  • Spring Context 내에서 효과가 있음

  • Bean을 일부만 Mocking하는 것

  • @SpyBean이 인터페이스인 경우 구현체가 Spring Context에 등록되어 있어야 에러 발생 X

 

@InjectionMocks

  • @Mock이나 @Spy로 생성된 객체를 자동으로 주입

  • 생성자, 필드, setter를 통해 주입 가능

  • 수동으로 주입할 필요 없이 Mockito가 알아서 주입해줌

 

2. 테스트 항목 @BeforeEach, given절, when절에 배치

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

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

    // when
    1-2. 댓글 생성

    // then
    검증
}

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

    // when
    2-3. 댓글 수정

    // then
    검증
}

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

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

    // then
    검증        
}"

 

Why?

각 테스트에서 검증하려는 것이 무엇인지 고민해봤다.

1번 테스트는 댓글 작성 가능 여부

2번 테스트는 댓글 수정 가능 여부

3번 테스트는 자신 외의 다른 사람이 댓글 수정 불가능 여부

 

그렇다면 검증하려는 것이 when에 들어가야 한다고 생각했다.

그리고 이에 필요한 것들을 given에 넣었다.

 

그런데 사용자 생성과 게시물 생성은 각 테스트의 given에 공통적이라고 생각해 @BeforeEach로 넣었다.

given에도 각 테스트에 필요한 것들만 준비하는 것이 좋다고 생각했다.

 

댓글을 작성해보세요.

채널톡 아이콘