Spring 웹 애플리케이션을 개발하다 보면, 필연적으로 여러 객체들 간의 의존성이 생기기 마련이다.
이런 의존성들은 단위 테스트 작성을 어렵게 한다. 이를 해결하기 위한 가짜 객체를 주입시켜주는 Mockito 라이브러리가 있다.
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>3.1.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>3.1.0</version>
<scope>test</scope>
</dependency>
MemberService memberService = mock(MemberService.class);
StudyRepository studyRepository = mock(StudyRepository.class);
@Mock 애노테이션으로 만드는 방법
@ExtendWith(MockitoExtension.class)
필드
@ExtendWith(MockitoExtension.class)
class StudyServiceTest {
@Mock MemberService memberService;
@Mock StudyRepository studyRepository;
메소드 매개변수
@ExtendWith(MockitoExtension.class)
class StudyServiceTest {
@Test
void createStudyService(@Mock MemberService memberService,
@Mock StudyRepository studyRepository) {
StudyService studyService = new StudyService(memberService, studyRepository);
assertNotNull(studyService);
}
}
모든 Mock 객체의 행동
Mock 객체를 조작해서
// memberService 객체에 findById 메소드를 1L 값으로 호출하면 Optional.of(member) 객체를 리턴하도록 Stubbing
when(memberService.findById(1L)).thenReturn(member);
// studyRepository 객체에 save 메소드를 study 객체로 호출하면 study 객체 그대로 리턴하도록 Stubbing
when(studyRepository.save(study)).thenReturn(study);
BDD : 애플리케이션이 어떻게 “행동”해야 하는지에 대한 공통된 이해를 구성하는 방법으로, TDD에서 창안
행동에 대한 스펙
Mockito는 BddMockito 클래스를 통해 BDD 스타일의 API도 제공한다.
// When -> Given
given(memberService.findById(1L)).willReturn(member);
given(studyRepository.save(study)).willReturn(study);