스프링

[SpringBoot] JUnit과 Mockito로 효율적인 테스트 코드 작성법

개발자 쿠키 2024. 11. 24. 21:24

요약

  • 테스트 방식: 단위 테스트
  • 도구: Mockito를 활용한 모킹(Mock)으로 의존성 분리.
  • 목적: DesignServiceImpl의 showDesign 메서드가 예상대로 동작하는지 검증.
  • 주요 작업:
    1. Mock 객체(designRepository)로 외부 의존성 대체.
    2. Stub 설정으로 Mock의 반환값 정의.
    3. 서비스 메서드 호출 및 결과 검증. (assertThat)

 

테스트 코드 예제

DesignServiceImplTest.java

@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 메서드로, 조건이 참인지 확인합니다. 실패 시 테스트가 실패합니다.