[워밍업 클럽 4기 백엔드] Day 18 미션
28일 전
1. @Mock, @MockBean, @Spy, @SpyBean, @InjectMocks 의 차이를 한번 정리해 봅시다.
mockito 관련 어노테이션
@Mock
역할 : 가짜 (mock) 객체를 생성해줌
주용도 : 의존 객체의 동작을 테스트 대상과 분리하고자 할때 사용
@MockBean
역할 : spring applicationContext에 있는 기존 빈을 mockito의 mock 객체로 교체함
용도 : 통합 테스트시 sping bean의 동작을 mock으로 대체할때 사용
@Spy
역할 : 실제 객체를 감싸서 생성한 spy 객체를 만듬
용도 : 객체의 대부분 로직은 그대로 사용하면서 특정 메서드만 mock 하고 싶을때 사용
@SpyBean
역할 : spring bean 을 spy 객체를 감싸서 일부는 실제 메서드 실행
용도 : spring 통합 테스트에서 실제 빈의 대부분은 사용하되 특정메서드만 mocking 하고 싶을때 사용
@InjectMocks
역할 : @mock 또는 @spy 로 선언 된 객체들을 해당 객체에 자동 주입하여 테스트 대상 객체를 생성
용도 : 테스트 대상 객체를 명시하고 그 내부 의존성을 자동으로 mock/spy 객체로 주입할때 사용
2. 아래 3개의 테스트가 있습니다.
내용을 살펴보고, 각 항목을 @BeforeEach, given절, when절에 배치한다면 어떻게 배치하고 싶으신가요?
(@BeforeEach에 올라간 내용은 공통 항목으로 합칠 수 있습니다. ex. 1-1과 2-1을 하나로 합쳐서 @BeforeEach에 배치)
@BeforeEach
void setUp() {
사용자 생성에 필요한 내용 준비 (1-1, 2-1, 3-1)
사용자 생성 (1-2, 2-2, 3-2)
게시물 생성에 필요한 내용 준비 (1-3, 2-3, 3-5)
게시물 생성 (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
사용자2 생성에 필요한 내용 준비 (3-3)
사용자2 생성 (3-4)
사용자1의 댓글 생성에 필요한 내용 준비 (3-7)
사용자1의 댓글 생성 (3-8)
// when
사용자2가 사용자1의 댓글 수정 시도 (3-9)
// then
검증
}
@BeforeEach 추출한 조건
각 테스트시 필요없는것만 배치 , 수정해도 모든 테스트에 영향을 주지 않는것
모든 테스트에서 공통적인 수행되는 부분 추출
댓글을 작성해보세요.