위 프로젝트를 참고하여 기본적인 웹 애플리케이션 코드를 꼭 확인하자!
BDD 스타일로 Mockito 사용하기
개요
BDD란?
- BDD: Behavior Driven Development
- 애플리케이션이 어떻게 행동해야 하는지에 대한 공통된 이해를 구성하는 방법이다.
- TDD(Test Driven Development)에서 창안되었다.
Given-When-Then 패턴
- Given
- 어떤 테스트에 대한 준비단계
- When
- 어떤 테스트에 대한 실행단계
- Then
- 어떤 테스트에 대한 검증단계
주요 변경 사항
Mockito는 BddMockito라는 클래스를 통해 BDD 스타일의 API를 제공한다.
- when ⇒ given
- verify ⇒ then
when → given
- 기존에 사용하던
when()
메서드와thenReturn()
,thenThrow()
메서드를 아래와 같이 변경하여 사용한다. when()
⇒given()
thenReturn()
⇒willReturn()
thenThrow()
⇒willThrow()
요약
when(memberService.findById(1L)).thenReturn(Optional.of(member)); //기존 코드
given(memberService.findById(1L)).willReturn(Optional.of(member)); //BDD 스타일 코드
예시 코드
import static org.mockito.BDDMockito.given;
//나머지 import 생략
class StudyServiceTest {
@DisplayName("BDD 스타일 API")
@Test
void testBdd(@Mock MemberService memberService,
@Mock StudyRepository studyRepository) {
//------------- given -------------
StudyService studyService = new StudyService(memberService, studyRepository);
Study study = new Study(10, "java");
Member member = new Member();
member.setId(1L);
member.setEmail("test@test.com");
//행동 정의(given)
given(memberService.findById(1L)).willReturn(Optional.of(member));
given(studyRepository.save(study)).willReturn(study);
//------------- when -------------
studyService.createNewStudy(1L, study);
//------------- then -------------
assertEquals(study, newStudy);
//행동 검증(차후 설명)
verify(memberService, times(1)).findById(1L);
}
}
verify → then
- 기존에 사용하던
verify()
메서드를 아래와 같이 변경하여 사용한다. verify()
⇒then()
verifyNoMoreInteractions()
⇒shouldHaveNoMoreInteractions()
should()
요약
verify(memberService, times(1)).findById(1L); //기존 코드
then(memberService).should(times(1)).findById(1L); //BDD 스타일 코드
verifyNoMoreInteractions(memberService); //기존 코드
then(memberService).shouldHaveNoMoreInteractions(); //BDD 스타일 코드
예시 코드
import static org.mockito.BDDMockito.given;
import static org.mockito.BDDMockito.then;
//나머지 import 생략
class StudyServiceTest {
@DisplayName("BDD 스타일 API")
@Test
void testBdd(@Mock MemberService memberService,
@Mock StudyRepository studyRepository) {
//------------- given -------------
StudyService studyService = new StudyService(memberService, studyRepository);
Study study = new Study(10, "java");
Member member = new Member();
member.setId(1L);
member.setEmail("test@test.com");
//행동 정의(given)
given(memberService.findById(1L)).willReturn(Optional.of(member));
given(studyRepository.save(study)).willReturn(study);
//------------- when -------------
studyService.createNewStudy(1L, study);
//------------- then -------------
assertEquals(study, newStudy);
//행동 검증
then(memberService).should(times(1)).findById(1L);
}
}
- 본 게시글은 백기선님의 강의를 토대로 정리한 글입니다.
- 더 자세한 내용을 알고 싶으신 분들이 계신다면, 해당 강의를 수강하시는 것을 추천드립니다.