반응형
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..." 라는 콘솔이 나오면 클릭한다.
Testing library 가 JUnit5 로 설정되어 있지 않으면 맞춰주고, OK 를 클릭한다.
테스트 작성
- @Mock 어노테이션을 활용할 수 있도록 해주는 확장 모델
- @Mock 객체를 주입하기 위해 사용
- 테스트 대상이 되는 클래스 객체로 보통 "sut" 이라고 네이밍을 한다. (system under test)
- 사용되는 빈에 대해 Mock 처리를 한다.
- 사용되는 빈
- 각 테스트 이전에 실행되어야 하는 작업을 수행하기 위해 사용되는 어노테이션
- sut 초기화
- 테스트의 이름을 명확하게 설정
- 테스트 임을 명시
- 함수 이름은 항상 유의미하게 설정
- 테스트는 보통 given-when-then 순으로 작성되며 given 은 주어진 데이터/환경을 의미
- 실행되었을 때
- 결과 검증 단계
- .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)
}
반응형
'스프링' 카테고리의 다른 글
[스프링] REST Docs, asciidoctor 로 API 문서 관리하기 (0) | 2023.02.06 |
---|---|
[스프링] JPA 관련 통합 테스트 환경 구축하기 (0) | 2023.02.06 |
[스프링] 스프링에서 관리하는 자바 객체, 빈 (Bean) (0) | 2023.02.03 |
[스프링] 프로그래밍 방식의 트랜잭션 관리 방법 (0) | 2023.02.03 |
[스프링] 스프링의 역사 (0) | 2023.02.02 |
댓글