![[Mockito] Mockito 시작하기 [Mockito] Mockito 시작하기](http://t1.daumcdn.net/tistory_admin/static/images/xBoxReplace_250.png)
build.gradle 입니다.
스프링 부트로 프로젝트를 생성하게 되면 spring-boot-starter 의존성을 따라서 기본으로 mockito가 들어오게 됩니다.
![[Mockito] Mockito 시작하기 [Mockito] Mockito 시작하기](https://blog.kakaocdn.net/dn/NxKtX/btrI7MRxGhr/qBFAfe5NzFSPWklFnAYi60/img.png)
스프링부트는 버전을 명시해주지 않으면 최신버전으로 가져오기 떄문에 Junit이 기본으로 들어온것처럼 mockito도 4.5.1 버전으로 의존성이 추가 된것을 확인 할 수 있습니다.
만약 스프링부트로 프로젝트를 하지 않을경우 메이븐 레포지토리에서 찾아서 추가해주면 됩니다.
https://mvnrepository.com/search?q=mockito
Mock 객체 만들기
MemberService
public interface MemberService {
Optional<Member> findById(Long memberId);
}
구현체가 없는 인터페이스 입니다.
studyService
public class StudyService {
private final MemberService memberService;
private final StudyRepository repository;
public StudyService(MemberService memberService, StudyRepository repository) {
assert memberService != null;
assert repository != null;
this.memberService = memberService;
this.repository = repository;
}
public Study createNewStudy(Long memberId, Study study) {
Optional<Member> member = memberService.findById(memberId);
study.setOwner(member.orElseThrow(() ->
new IllegalArgumentException("Member doesn't exist for id: '" + memberId + "'")));
return repository.save(study);
}
}
createNewStudy에서 member를 찾아서 없으면 예외를 던지고 있으면 studyOwner 스터디주인장을 조회한 멤버로 해서 스터디를 만드는 코드입니다.
assert는 JDK1.4부터 지원해온 예약어 입니다.
assert [Boolean] : 참이면 pass 거짓이면 AssertionError를 반환합니다.
그래서 항상 memberService와 repository가 null이 아니여야하기 위해서 assert로 null체크를 해줍니다.
위와 같은 경우가 mock객체를 만들기 적절한 경우입니다.
인터페이스만 있고 구현체가 없습니다. 내가 만들고 있는 이 코드가 의존하고있는 클래스들(memberService, repository)에 의존해서 작성하는데 잘 작동하는지 확인을 하기 위해서 입니다.
이제 위의 코드로 테스트 코드를 만들어 보겠습니다.
StudyServiceTest
Mockito.mock() 메소드로 만드는 방법
import me.jisu.javamockito.member.MemberService;
import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.mockito.Mockito.mock;
class StudyServiceTest {
@Test
void createStudyService() {
MemberService memberService = mock(MemberService.class);
StudyRepository studyRepository = mock(StudyRepository.class);
StudyService studyService = new StudyService(memberService, studyRepository);
assertNotNull(studyService);
}
}
@Mock 애노테이션으로 만드는 방법
import me.jisu.javamockito.member.MemberService;
import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import static org.junit.jupiter.api.Assertions.assertNotNull;
class StudyServiceTest {
@Mock MemberService memberService;
@Mock StudyRepository studyRepository;
@Test
void createStudyService() {
StudyService studyService = new StudyService(memberService, studyRepository);
assertNotNull(studyService);
}
}
위와 같이 생성하면 위에서말한 AssertionError가 발생합니다. MemberService 와 StudyRepository가 널이기 때문입니다.
package me.jisu.javamockito.study;
import me.jisu.javamockito.member.MemberService;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import static org.junit.jupiter.api.Assertions.assertNotNull;
@ExtendWith(MockitoExtension.class)
class StudyServiceTest {
@Mock MemberService memberService;
@Mock StudyRepository studyRepository;
@Test
void createStudyService() {
StudyService studyService = new StudyService(memberService, studyRepository);
assertNotNull(studyService);
}
}
클래스 위의 @ExtendWith(MockitoExtension.class)를 등록해줘야합니다.
이제 목객체를 만들어주기 떄문에 테스트가 통과하게 됩니다.
하지만 이제 테스트중의 Mock객체를 필드가 아닌 하나의 메소드에서만 만들고 싶을때도 있습니다.
그럴떄는 다음과 같이 하면 됩니다.
@ExtendWith(MockitoExtension.class)
class StudyServiceTest {
@Test
void createStudyService(@Mock MemberService memberService,
@Mock StudyRepository studyRepository) {
StudyService studyService = new StudyService(memberService, studyRepository);
assertNotNull(studyService);
}
}
이렇게 Mock객체를 만들 수 있습니다.
제가 테스트 하고 싶은 것은 StudyService 이지만 MemberServicer와 StudyRepository가 준비가 되어 있지 않은 상황이라면 또는 구현체가 있지만 StudyService에 있는 코드만 테스트 하고 싶다.다른쪽 코드는 테스트 하고 싶지 않다면 이런식으로 Mock객체를 만들어 테스트를 하면 됩니다.
'Spring Boot > Mockito' 카테고리의 다른 글
[Mockito] BDD 스타일 API + BDD (0) | 2022.08.07 |
---|---|
[Mockito] Verify(검증) (0) | 2022.08.07 |
[Mockito] Mock 객체 Stubbing (0) | 2022.08.07 |
[Mockito] Mockito (0) | 2022.08.07 |
댓글