본문 바로가기
스프링

[스프링] JUnit5, AssertJ, Mockito 기반 테스트 환경 구축하기

by kdohyeon (김대니) 2023. 2. 6.
반응형

JUnit5, AssertJ, Mockito 를 활용해서 스프링 부트에서 테스트 환경을 구축해보자

의존성 추가

아래를 참고하여 의존성을 추가한다.

각 의존성에 대한 버전은 최신 버전으로 추가해주면 될 듯하다.

dependencies {
    // JUnit 라이브러리
    testImplementation("org.junit.jupiter:junit-jupiter-api")
    testImplementation("org.junit.jupiter:junit-jupiter-params")
    testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine")
    
    // 테스트 코드의 가독성을 높여주는 메소드를 위한 라이브러리
    testImplementation("org.assertj:assertj-core")
    
    // 테스트에 필요한 Mock 객체 생성을 위한 라이브러리
    testImplementation("org.mockito:mockito-core")
    testImplementation("org.mockito:mockito-junit-jupiter")
}

테스트 대상 선정

테스트를 수행하려는 클래스에 가서 (MacOS 기준) "Command + Shift + T" 를 클릭한다. "Create New Test..." 라는 콘솔이 나오면 클릭한다.

Create New Test... 를 클릭하자

Testing library 가 JUnit5 로 설정되어 있지 않으면 맞춰주고, OK 를 클릭한다.

Testing library 확인하기

테스트 작성

  1. @Mock 어노테이션을 활용할 수 있도록 해주는 확장 모델
  2. @Mock 객체를 주입하기 위해 사용
  3. 테스트 대상이 되는 클래스 객체로 보통 "sut" 이라고 네이밍을 한다. (system under test)
  4. 사용되는 빈에 대해 Mock 처리를 한다.
  5. 사용되는 빈
  6. 각 테스트 이전에 실행되어야 하는 작업을 수행하기 위해 사용되는 어노테이션
  7. sut 초기화
  8. 테스트의 이름을 명확하게 설정
  9. 테스트 임을 명시
  10. 함수 이름은 항상 유의미하게 설정
  11. 테스트는 보통 given-when-then 순으로 작성되며 given 은 주어진 데이터/환경을 의미
  12. 실행되었을 때
  13. 결과 검증 단계
  14. .upsert(...) 메소드가 1번 실행되면 성공
@ExtendWith(MockitoExtension.class) // ... (1)
class BlogSearchServiceTest {
    @InjectMocks // ... (2)
    BlogSearchService sut; // ... (3)

    @Mock // ... (4)
    BlogPort blogPort; // ... (5)

    @Mock
    UpsertBlogStatisticsUseCase upsertBlogStatisticsUseCase;

    @Mock
    BlogDtoConverter blogDtoConverter;

    @BeforeEach // ... (6)
    void setup() {
        sut = new BlogSearchService(
                blogPort,
                upsertBlogStatisticsUseCase,
                blogDtoConverter
        ); // ... (7)
    }

    @DisplayName("블로그를 조회할 땐, 검색어를 저장한다.") // ... (8)
    @Test // ... (9)
    void saveKeywordWhenSearchingBlogs() { // ... (10)
        // given // ... (11)
        var command = BlogSearchCommand.builder()
        				.keyword("키워드")
        				.build();

        // when // ... (12)
        sut.search(command);

        // then // ... (13)
        verify(upsertBlogStatisticsUseCase, times(1))
                .upsert(any(UpsertBlogStatisticsCommand.class)); // (14)
    }
반응형

댓글