스프링
[SpringBoot] JUnit과 Mockito로 효율적인 테스트 코드 작성법
개발자 쿠키
2024. 11. 24. 21:24
요약
- 테스트 방식: 단위 테스트
- 도구: Mockito를 활용한 모킹(Mock)으로 의존성 분리.
- 목적: DesignServiceImpl의 showDesign 메서드가 예상대로 동작하는지 검증.
- 주요 작업:
- Mock 객체(designRepository)로 외부 의존성 대체.
- Stub 설정으로 Mock의 반환값 정의.
- 서비스 메서드 호출 및 결과 검증. (assertThat)
테스트 코드 예제
@ExtendWith(MockitoExtension.class)
public class DesignServiceImplTest {
private static final Logger log = LoggerFactory.getLogger(DesignServiceImplTest.class);
@Mock
private DesignRepository designRepository;
@InjectMocks
private DesignServiceImpl designService;
@Test
void 디자인_뷰_memberId로_조회한다() {
Long memberId = 2L;
Member member = ChildFixture.builder()
.id(memberId)
.build();
Design design = DesignFixture.builder()
.memberId(memberId)
.member(member)
.color(ColorType.valueOf("PINK1"))
.character(CharacterType.valueOf("HEARTSPRING"))
.build().build();
when(designRepository.findById(memberId)).thenReturn(Optional.of(design));
DesignResponse foundDesign = designService.showDesign(memberId);
assertThat(foundDesign.getColor()).isEqualTo(design.getColor().name());
assertThat(foundDesign.getCharacter()).isEqualTo(design.getCharacter().name());
}
}
- @ExtendWith(MockitoExtension.class): Mockito를 사용해 의존성을 모킹(Mocking)하기 위해 필요한 설정입니다. 이 어노테이션은 테스트 클래스에 Mockito의 확장을 적용합니다.
- @Mock: designRepository를 Mock 객체로 만듭니다. 데이터베이스와 직접 연결하지 않고, 원하는 값을 반환하도록 설정할 수 있습니다.
- @InjectMocks: designService는 테스트할 대상입니다. @Mock으로 선언된 객체(designRepository)를 자동으로 주입하여 테스트 환경을 구성합니다.
- @Test: 이 메서드가 테스트 메서드임을 JUnit에 알립니다.
- ChildFixture는 Member 객체를 생성하기 위한 빌더 클래스입니다.
when(designRepository.findById(memberId)).thenReturn(Optional.of(design));
- designRepository.findById(memberId) 호출 시, 실제 DB를 조회하는 대신, 미리 설정된 Optional.of(design) 객체를 반환하도록 Mocking합니다.
assertThat(foundDesign.getColor()).isEqualTo(design.getColor().name());
assertThat(foundDesign.getCharacter()).isEqualTo(design.getCharacter().name());
- foundDesign.getColor()가 기대한 값(design.getColor().name())과 일치하는지 검증합니다.
- foundDesign.getCharacter()가 기대한 값(design.getCharacter().name())과 일치하는지 검증합니다.
- assertThat: JUnit의 assert 메서드로, 조건이 참인지 확인합니다. 실패 시 테스트가 실패합니다.