Mock : 진짜 객체와 비슷하게 동작하지만 프로그래머가 직접 그 객체의 행동을 관리하는 객체
-> 단위 테스트를 진행할 때 실제 객체를 만들어서 사용하게 되면 의존성이 높아져 복잡해진다. 이문제를 해결하기 위해 사용
Mockito : Mock 객체를 쉽게 만들고 관리하고 검증할 수 있는 방법을 제공
단위 테스트를 위한 Java mocking framework입니다.
스프링 부트 : spring boot start test에서 자동으로 Mockito 추가해줌
MemberService memberService = mock(MemberService.class);
StudyRepository studyRepository = Mockito.mock(StudyRepository.class);
@ExtendWith(MockitoExtension.class)
class StudyServiceTest {
//필드
@Mock MemberService memberService;
@Mock StudyRepository studyRepository;
//매개 변수
@Test
void createStudyService(@Mock MemberService memberService,
@Mock StudyRepository studyRepository) {
StudyService studyService = new StudyService(memberService, studyRepository);
assertNotNull(studyService);
}
모든 Mock 객체의 행동을 정의하는 것
1.
//mock 객체의 행동을 조작
//findById를 할때 memeber 클래스를 return
when(memberService.findById(1L)).thenReturn(member);
when(memberService.findById(any()).thenReturn(member);//어떠한 형태가 들어오든
2.
when(memberService.findById(1L)).thenThrow(new RuntimeException());
when(memberService.findById(1L)).thenReturn(member)
.thenThrow(new RuntimeException())
.thenReturn(null);
Mock 객체가 어떻게 사용이 됐는지 검증
//notify라는 메서드가 한번이라도 호출되어야된다.
verify(memberService,times(1)).notify(any());
verify(memberService,never()).notify(any());
InOrder inOrder = inOrder(memberService);
inOrder.verify(memberService).notify(any());
BDD : 애플리케이션이 어떻게 "행동"해야 하는지에 대한 공통된 이해를 구성하는 방법으로 TDD에서 창안했다.
Given 영역에 when이라는 이름이 어울리지 않아 새로 만들었다고 한다. BDDMockito는 Mockito를 상속하기 때문에 기능은 같다.
Mockito는 BddMockito라는 클래스를 통해 BDD 스타일의 API를 제공한다.
When -> Given
given(memberService.findById(1L)).willReturn(Optional.of(member));
given(studyRepository.save(study)).willReturn(study);
Verify -> Then
then(memberService).should(times(1)).notify(study);
then(memberService).shouldHaveNoMoreInteractions();