[워밍업 클럽 4기 백엔드] Day 18 미션
1. Mock 관련 어노테이션 정리하기
📌@Mock
Mockito에서 제공하는 어노테이션
실제 객체를 생성하지 않고, 가짜 객체를 생성하여 해당 객체의 행위에 대한 반환값 조작 및 메서드 호출을 확인할 수 있다.
만약 메서드를 stubbing 하지 않으면 기본값이 반환된다.(String : "", int : 0)
단위 테스트를 수행할 때 적합하다.
객체 생성 비용이 많이 발생하거나, 기능 수행 비용이 많이 발생하는 경우(외부 API 호출, 메일 전송 등)에 사용하면 테스트의 효용성을 높일 수 있다.
📌@MockitoBean
Spring Boot가 제공해주던
@MockBean이 deprecated되고, Spring 프레임워크에서 기능이 같은@MockitoBean을 제공해준다.Spring Context에 가짜 객체를 등록한다.
@SpringBootTest와 같이 사용되어야 한다.Spring DI 로 의존성을 주입해준다.
통합 테스트를 수행할 때 적합하다.
@Mock과 기능은 동일하다.
📌@Spy
Mockito에서 제공하는 어노테이션
실제 객체를 감싸서 Spy 객체를 만든다.
stubbing 하지 않은 메서드는 실제 객체의 메서드의 기능이 작동된다.
특정 기능의 반환값을 조작하고 싶다면 stubbing을 꼭 해줘야 한다.
일부 동작만 stubbing하고, 나머지는 실제 동작을 테스트하고 싶을 때 유용하다.
단위 테스트를 수행할 때 적합하다.
📌 @MockitoSpyBean
Spring Boot가 제공해주던
@SpyBean이 deprecated되고, Spring 프레임워크에서 기능이 같은@MockitoSpyBean을 제공해준다.Spring Context에 등록된 기존 빈을 감싸서 Spy 객체로 만든다.
@SpringBootTest와 같이 사용되어야 한다.Spring DI 로 의존성을 주입해준다.
통합 테스트를 수행할 때 적합하다.
@Spy와 기능은 동일하다.
📌 @InjectMocks
Mockito에서 제공하는 어노테이션
테스트 할 대상 객체를 생성하고, 이 객체에 필요한 의존성 (
@Mock과@Spy로 생성된 객체)을 자동으로 주입해준다.
2. 각 항목을 적절한 위치에 배치하기
@BeforeEach
void setUp() {
1-1, 2-1, 3-1. 사용자 생성에 필요한 내용 준비
1-3, 2-3, 3-5. 게시물 생성에 필요한 내용 준비
1-2, 2-2, 3-2. 사용자 생성
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
3-3. 사용자2 생성에 필요한 내용 준비
3-4. 사용자2 생성
3-7. 사용자1의 댓글 생성에 필요한 내용 준비
3-8. 사용자1의 댓글 생성
// when // then
3-9. 사용자2가 사용자1의 댓글 수정 시도
검증
}💡고려 사항
댓글 관련 기능을 테스트하므로 이와 관련 없는 사용자, 게시물 생성을 테스트 코드에서 분리하고, 독립성에도 문제가 없기 때문에 공유 변수로 설정
댓글은 테스트의 주체이므로 각 메서드 내부에서 생성하여 테스트 간 독립성을 보장
cannotUpdateCommentWhenUserIsNotWriter()사용자2 데이터는 해당 메서드에서만 사용하기 때문에 분리할 필요가 없다고 판단사용자1과 다른 사용자2가 있다는 것을 명시적으로 테스트 코드에 보여주어야 무엇을 테스트 하는지 이해를 도울 수 있다고 판단
3-9는 예외를 검증하는 코드이므로
assertThatThrownBy()을 사용할 것으로 생각되어 when, then 절에 배치
댓글을 작성해보세요.