[인프런 워밍업클럽 백엔드 4기] Day18미션
3개월 전
@Mock, @MockBean, @Spy, @SpyBean, @InjectMocks 의 차이를 한번 정리해 봅시다.
Mock
해당 클래스 혹은 인터페이스의 목 인스턴스를 생성한다. stub을 통해 사용되는 케이스에 대해 반환값을 지정해주어야한다.
MockBean
해당 인터페이스 혹은 클래스의 목 인스턴스를 생성하고 스프링 빈 중 해당 클래스, 인터페이스의 빈이 필요할 경우 주입한다.
Spy
해당 클래스의 구현체를 기반으로 스파이 인스턴스를 생성한다.
기본적으로 위임을 통해 기존로직들을 수행하고 추가적으로 stub이 가능하다.
SpyBean
해당 인터페이스 혹은 클래스의 스파이 인스턴스를 생성하고 스프링 빈 중 해당 클래스, 인터페이스의 빈이 필요할 경우 주입한다.
InjectMocks
해당 클래스의 생성자에 필요한 멤버들을 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로 분리합니다.
댓글을 작성해보세요.