워밍업 클럽 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에도 각 테스트에 필요한 것들만 준비하는 것이 좋다고 생각했다.
댓글을 작성해보세요.