본문 바로가기

Java/Test

(Test) Mock 객체 만들기

현재 StudyService에 대한 테스트를 진행하려고 하지만 

인스턴스 생성 시 디폴스 생성자가 없기 때문에 MemberService member, StudyRepository에 대한 변수를 넣을 방법이 없다. 

(둘 다 interface이고 이것을 구현할 구현체가 없다.)

 

그렇다면 구현체를 일일이 만들어서 테스트를 진행해보자

더보기
MemberService memberService = new MemberService() {
            @Override
            public Optional<Member> findById(Long memberId) throws MemberNotFoundException {
                return Optional.empty();
            }
        };

        StudyRepository studyRepository = new StudyRepository() {
            @Override
            public List<Study> findAll() {
                return null;
            }

            @Override
            public List<Study> findAll(Sort sort) {
                return null;
            }

            @Override
            public List<Study> findAllById(Iterable<Long> iterable) {
                return null;
            }

            @Override
            public <S extends Study> List<S> saveAll(Iterable<S> iterable) {
                return null;
            }

            @Override
            public void flush() {

            }

            @Override
            public <S extends Study> S saveAndFlush(S s) {
                return null;
            }

            @Override
            public void deleteInBatch(Iterable<Study> iterable) {

            }

            @Override
            public void deleteAllInBatch() {

            }

            @Override
            public Study getOne(Long aLong) {
                return null;
            }

            @Override
            public <S extends Study> List<S> findAll(Example<S> example) {
                return null;
            }

            @Override
            public <S extends Study> List<S> findAll(Example<S> example, Sort sort) {
                return null;
            }

            @Override
            public Page<Study> findAll(Pageable pageable) {
                return null;
            }

            @Override
            public <S extends Study> S save(S s) {
                return null;
            }

            @Override
            public Optional<Study> findById(Long aLong) {
                return Optional.empty();
            }

            @Override
            public boolean existsById(Long aLong) {
                return false;
            }

            @Override
            public long count() {
                return 0;
            }

            @Override
            public void deleteById(Long aLong) {

            }

            @Override
            public void delete(Study study) {

            }

            @Override
            public void deleteAll(Iterable<? extends Study> iterable) {

            }

            @Override
            public void deleteAll() {

            }

            @Override
            public <S extends Study> Optional<S> findOne(Example<S> example) {
                return Optional.empty();
            }

            @Override
            public <S extends Study> Page<S> findAll(Example<S> example, Pageable pageable) {
                return null;
            }

            @Override
            public <S extends Study> long count(Example<S> example) {
                return 0;
            }

            @Override
            public <S extends Study> boolean exists(Example<S> example) {
                return false;
            }
        };

이것을 일일이 임의의 구현한 다음 파라미터로 넣어주어야 한다.

얼마나 비효율적인가?

이러한 일을 Mockito가 대신해준다.

 

 

두줄이면 Mock객체를 만들 수 있다.

MemberService memberService = mock(MemberService.class);
StudyRepository studyRepository = mock(StudyRepository.class);

이것도 귀찮으면 애노테이션을 이용하는 방법이 있다. 

 

Mock 객체를 여러 테스트에서 이용

  • @ExtendWith와 @Mock 이용 (@Mock만 사용하면 인스턴스가 Null이 되므로 오류가 발생한다.
@ExtendWith(MockitoExtension.class)
@Mock
MemberService memberService;

@Mock
StudyRepository studyRepository;

Mock 객체를 하나의 테스트에서 이용 (파라미터에 Mock 설정)

@Test
void createStudyService(@Mock MemberService memberService, @Mock StudyRepository studyRepository) {

    StudyService studyService = new StudyService(memberService, studyRepository);

    assertNotNull(studyRepository);
}

코드 참조

https://github.com/mike6321/PURE_JAVA/tree/master/HowToTest/inflearn-the-java-test

 

mike6321/PURE_JAVA

Contribute to mike6321/PURE_JAVA development by creating an account on GitHub.

github.com

 

'Java > Test' 카테고리의 다른 글

(Test) Mock 객체 확인  (0) 2020.01.05
(Test) Mock 객체 Stubbing  (0) 2020.01.05
(Test) Mockito 란?  (0) 2020.01.01
(Test) JUit5 - JUnit4 Migration  (0) 2020.01.01
(Test) JUit5 확장모델  (0) 2020.01.01