inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

인프런 워밍업 스터디 클럽 2기 백엔드(클린코드&테스트코드) Day 18 미션

zooxop
0

인프런 워밍업 클럽 2기, 백엔드(클린코드&테스트코드) 과정에 참여하고 있습니다.

이번 글은 Day 18 미션 제출을 위해 작성하였습니다.

[미션 내용]

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

  2. 미션에서 제공된 예제를 살펴보고, 각 항목을 @BeforeEach, given절, when절에 배치해보기

     

강의 링크: Readable Code: 읽기 좋은 코드를 작성하는 사고법


 

1. Test Double Annotations 특징

@Mock
private UserService userService;

// 사용 예시
when(userService.findById(1L)).thenReturn(new User());
@MockBean
private UserService userService; 
@Spy
private UserService userService;

// 특정 메서드만 Mock 처리
doReturn(new User()).when(userService).findById(1L);
@SpyBean
private UserService userService;
@Mock
private UserRepository userRepository;

@InjectMocks
private UserService userService;  // userRepository가 자동 주입됨

 

주요 차이점

  1. 통합 테스트 필요 여부 차이

    1. 필요: @MockBean, @SpyBean

    2. 불필요: @Mock, @Spy, @InjectMocks

  2. 동작 방식

    1. 완전한 가짜 객체: @Mock, @MockBean

    2. 실제 객체를 부분적으로 Mocking: @Spy, @SpyBean

 


 

@BeforeEach, given절, when절에 배치해보기

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

@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
    3-9. 사용자2가 사용자1의 댓글 수정 시도

    // then
    검증        
}

 

백엔드 워밍업클럽 백엔드 클린코드 테스트코드 미션

답변 0