ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 패스트캠퍼스 챌린지 19일차
    JAVA/Spring 2021. 11. 19. 23:24

    Service 테스트

    저번 시간에 했던 Controller 테스트에 이어서 이번 시간에는 Service 테스트를 진행한다.

    이전에 JUnit과 Mockito에 대한 간략한 학습을 하며 만들 었던 DMakerServiceTest 파일을 열어주고 안에 새로운 test 메서드를 만들어준다.

     

    dmaker.service.DMakerServiceTest

    @Test
    void createDeveloperTest_success() {
        //given
        // Mocking 등 테스트에 활용될 지역변수들을 생성
    
        //when
        // 테스트하고자 하는 동작 및 그 결과값을 받아오는 부분
    
        //then
        // 우리가 예상한 부분들이 알맞게 동작하는지 검증하는 부분
    }

    위의 코드를 보면 Comment를 작성하여 테스트를 구조화한 것을 확인할 수 있다.

    이제 테스트를 진행하기 위한 코드를 Comment에 맞춰서 작성해준다.

    @Test
    void createDeveloperTest_success() {
            //given
            // Mocking 등 테스트에 활용될 지역변수들을 생성
    
            // createDeveloper를 테스트하기 위한 변수 생성
            CreateDeveloper.Request request = CreateDeveloper.Request.builder()
                    .developerLevel(SENIOR)
                    .developerSkillType(FRONT_END)
                    .experienceYears(12)
                    .age(32)
                    .memberId("memberId")
                    .name("name")
                    .build();
    
            // given(developerRepository.findByMemberId(anyString()))
            //        .willReturn(Optional.ofNullable(null));
    
            // 위의 ofNullable(null)이 empty()로 대체될 수 있다.
            given(developerRepository.findByMemberId(anyString()))
                    .willReturn(Optional.empty());
    
            //when
            // 테스트하고자 하는 동작 및 그 결과값을 받아오는 부분
            dMakerService.createDeveloper(request);
    
            //then
            // 우리가 예상한 부분들이 알맞게 동작하는지 검증하는 부분
    }

    우선 createDeveloper에 필요한 request에 builder를 통해 생성하려는 데이터를 담은 dto를 담아준다.

    다음으로 validation 중 Mocking이 필요한 findByMemberId를 given()을 통해 Mocking해주면 데이터베이스에 중복되는 MemberId가 있는지 확인해준다.

    그 후에 createDeveloper에 request가 전달되며 Developer 생성이 진행된다.

     

    이제 createDeveloper의 동작을 테스트 해야하는데 이 때 Mockito의 기능을 사용해준다.

    Mockito는 Mocking한 객체에 어떤 동작이 발생하며 거기에 전달된 매개 변수를 확인하고 캡쳐하는 기능이 있는데 이를 통해 developerRepository에 save되는 객체의 값을 확인할 수 있다.

    이를 위해 아래와 같은 코드를 테스트에 추가해준다.

    @Test
        void createDeveloperTest_success() {
            //given
            // Mocking 등 테스트에 활용될 지역변수들을 생성
    
            // createDeveloper를 테스트하기 위한 변수 생성
            CreateDeveloper.Request request = CreateDeveloper.Request.builder()
                    .developerLevel(SENIOR)
                    .developerSkillType(FRONT_END)
                    .experienceYears(12)
                    .age(32)
                    .memberId("memberId")
                    .name("name")
                    .build();
    
            // given(developerRepository.findByMemberId(anyString()))
            //        .willReturn(Optional.ofNullable(null));
    
            // 위의 ofNullable(null)이 empty()로 대체될 수 있다.
            given(developerRepository.findByMemberId(anyString()))
                    .willReturn(Optional.empty());
    
            ArgumentCaptor<Developer> captor =
                    ArgumentCaptor.forClass(Developer.class);
    
            //when
            // 테스트하고자 하는 동작 및 그 결과값을 받아오는 부분
            dMakerService.createDeveloper(request);
    
            //then
            // 우리가 예상한 부분들이 알맞게 동작하는지 검증하는 부분
            // Mocking된 developerRepository가 몇번 호출되고 전달된 값들을 captor에 캡쳐하여 담아준다.
            verify(developerRepository, times(1))
                    .save(captor.capture());
    
            // 캡쳐된 데이터를 saveDeveloper에 담아준 뒤 검증을 해준다.
            Developer savedDeveloper = captor.getValue();
            assertEquals(SENIOR, savedDeveloper.getDeveloperLevel());
            assertEquals(FRONT_END, savedDeveloper.getDeveloperSkillType());
            assertEquals(12, savedDeveloper.getExperienceYears());
        }

    위와 같은 방법으로 성공적인 케이스에 대한 테스트를 진행할 수 있다.

     

    다음으로 오류가 발생하는 케이스에 대한 테스트 코드를 작성해보자.

     

    dmaker.service.DMakerServiceTest

    @Test
        void createDeveloperTest_failed_with_duplicated() {
    
            given(developerRepository.findByMemberId(anyString()))
                    .willReturn(Optional.of(defaultDeveloper));
    
            ArgumentCaptor<Developer> captor =
                    ArgumentCaptor.forClass(Developer.class);
    
            //when
            //then
    
            // createDeveloper가 발생시키는 exception을 dMakerException에 담아준다.
            DMakerException dMakerException = assertThrows(DMakerException.class,
                    () -> dMakerService.createDeveloper(defaultCreateRequest));
    
            assertEquals(DMakerErrorCode.DUPLICATED_MEMBER_ID, dMakerException.getDMakerErrorCode());
        }

     위와 같은 방식으로 createDeveloper가 실패하는 케이스에 대한 테스트를 진행할 수 있다.

     

     

    본 포스팅은 패스트 캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
    https://bit.ly/3FVdhDa

     

    마이페이지 | 패스트캠퍼스

    성인 교육 서비스 기업, 패스트캠퍼스는 개인과 조직의 실질적인 '업(業)'의 성장을 돕고자 모든 종류의 교육 콘텐츠 서비스를 제공하는 대한민국 No. 1 교육 서비스 회사입니다.

    fastcampus.co.kr

    댓글

Designed by Tistory.