❓ Mission 1
✔ @Mock, @MockBean, @Spy, @SpyBean, @InjectMocks 의 차이를 한번 정리해 봅시다.
1️⃣ @Mock
특징
- Mockito의 가짜 객체를 생성하는데 사용한다.
- @ExtendWith(MockitoExtension.class)를 사용해서 테스트를 시작하기전에 @Mock을 감지한다.
- Spring Context와 무관하게 동작한다.
2️⃣ @MockBean
특징
- @SpringTest @WebMvcTest에 사용한다.
- 스프링빈을 Mock 객체로 대체한다.
- 실제로 사용할 빈은 @AutoWired를 사용하고 @AutoWired가 동작할때 Mock객체를 사용할수 있게 한다.
3️⃣ @InjectMocks
특징
- @Mock 또는 @Spy어노테이션이 붙혀진 객체들을 주입 해준다.
4️⃣ @Spy
특징
- Stub이면서 호출된 내용을 기록하여 보여줄수 있는 객체, 일부는 실제 객체 처럼 동작시키고,
일부만 Stubbing 할수 있다.
5️⃣ @SpyBean
특징
- MockBean과 비슷하게 SpringBean을 Spy로 감싸서 사용한다.
❓ Mission 2
✔ 아래 3개의 테스트가 있습니다.
내용을 살펴보고, 각 항목을 @BeforeEach, given절, when절에 배치한다면 어떻게 배치하고 싶으신가요?
(@BeforeEach에 올라간 내용은 공통 항목으로 합칠 수 있습니다. ex. 1-1과 2-1을 하나로 합쳐서 @BeforeEach에 배치)
@BeforeEach
void setUp() {
❓
}
@DisplayName("사용자가 댓글을 작성할 수 있다.")
@Test
void writeComment() {
1-1. 사용자 생성에 필요한 내용 준비
1-2. 사용자 생성
1-3. 게시물 생성에 필요한 내용 준비
1-4. 게시물 생성
1-5. 댓글 생성에 필요한 내용 준비
1-6. 댓글 생성
// given
❓
// when
❓
// then
검증
}
@DisplayName("사용자가 댓글을 수정할 수 있다.")
@Test
void updateComment() {
2-1. 사용자 생성에 필요한 내용 준비
2-2. 사용자 생성
2-3. 게시물 생성에 필요한 내용 준비
2-4. 게시물 생성
2-5. 댓글 생성에 필요한 내용 준비
2-6. 댓글 생성
2-7. 댓글 수정
// given
❓
// when
❓
// then
검증
}
@DisplayName("자신이 작성한 댓글이 아니면 수정할 수 없다.")
@Test
void cannotUpdateCommentWhenUserIsNotWriter() {
3-1. 사용자1 생성에 필요한 내용 준비
3-2. 사용자1 생성
3-3. 사용자2 생성에 필요한 내용 준비
3-4. 사용자2 생성
3-5. 사용자1의 게시물 생성에 필요한 내용 준비
3-6. 사용자1의 게시물 생성
3-7. 사용자1의 댓글 생성에 필요한 내용 준비
3-8. 사용자1의 댓글 생성
3-9. 사용자2가 사용자1의 댓글 수정 시도
// given
❓
// when
❓
// then
검증
}
✅ 내가 작성한 정답
@BeforeEach
void setUp() {
❓
1-1. 사용자 생성에 필요한 내용 준비
1-2. 사용자 생성
1-3. 게시물 생성에 필요한 내용 준비
1-4. 게시물 생성
}
@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
검증
}
❓ Why
@DisplayName("사용자가 댓글을 작성할 수 있다.")
@DisplayName("사용자가 댓글을 수정할 수 있다.")
@DisplayName("자신이 작성한 댓글이 아니면 수정할 수 없다.")
현재 3개 테스트 모두 댓글에 포커스를 맞춘다. 1번과 2번 테스트는 댓글이 성공적으로 작성,수정 되는지를 보는 테스트이기 때문에 사용자1과 사용자1이 게시하는 게시물에 대해서는 먼저 생성해도된다고 생각하였다.
3번 테스트는 사용자 1이 게시하는 게시물에 대해 사용자 1과 사용자 2번에 대해 댓글에 대한 권한을 알기위한 테스트라고 생각하여 이미 만들어진 사용자 1번과 사용자 1이 게시하는 게시물은 위 테스트가 말하는 바와 분리해도 될것 같아서 공통적으로 사용자 1 생성, 사용자1이 게시한 게시물을 @BeforeEach로 분리하였다. 하지만 3번 테스트에서 사용자 1과 다른 사용자2가 생성되는 것을 보여줘야 될것 같아 분리하지 않았다.
출처
[박우빈 강사님] Practical Testing: 실용적인 테스트 가이드
https://www.inflearn.com/course/practical-testing-%EC%8B%A4%EC%9A%A9%EC%A0%81%EC%9D%B8-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EA%B0%80%EC%9D%B4%EB%93%9C/dashboard
[인프런 워밍업 클럽 3기] 과제
'인프런 워밍업 클럽 3기' 카테고리의 다른 글
인프런 워밍업 스터디 클럽 3기 백엔드 Day 16미션 (0) | 2025.03.25 |
---|---|
인프런 워밍업 스터디 클럽 3기 백엔드 Day 4 미션 (0) | 2025.03.07 |