ABOUT ME

-

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

    JUnit & Mockito

    JUnit

    • Java의 유닛 테스트를 하기 위한 프레임워크이다.
    • JUnit4까지는 유닛 테스트를 진행하기에 어려움이 많았으나 최근 JUnit5로 업데이트되며 이전에 존재했던 여러 불편한 점들이 개선되었다.
    • Spring Boot에서도 JUnit4는 사라지고 JUnit5가 기본적으로 제공되고 있다.

    Spring Boot에 기본적으로 JUnit5가 제공되고 있기에 테스트 파일을 생성하는 방법도 굉장히 간단하다.

     

    먼저, 테스트할 클래스 파일을 연 뒤 Ctrl + Shift + T를 누르면 아래와 같이 Create New Test 옵션이 뜬다.

     Ctrl + Shift + T를 누르면 Create New Test 옵션이 뜬다.

    'Create New Test' 버튼을 눌러주면 아래와 같이 테스트 이름을 정하고 파일 경로를 설정할 수 있다.

    테스트 이름을 정하고 파일 경로를 설정할 수 있다.

    그 후 OK 버튼을 눌러주면 테스트가 생성되는 것을 볼 수 있다.

     

    이제 생성된 테스트에 메서드를 작성하여 테스트를 진행해볼 수 있다.

    아래는 테스트하기 위한 간단한 예제 코드이다.

     

    dmaker.service.DMakerServiceTest

    class DMakerServiceTest {
        @Test
        public void testSomething() {
            String result = "Hello" + " Spring World!";
    
            // JUnit jupiter에서 나오는 가장 많이 쓰는 검증방법 중 하나이다.
            assertEquals("Hello Spring World!", result);
        }
    }

    결과값인 result가 명시된 "Hello Spring World!"와 동일하면 빌드가 성공적으로 이루어지지만 다를 경우엔 아래와 같이 오류가 발생하는 것을 확인할 수 있다.

    Expected와 Actual이 달라서 오류가 났음을 알려준다.

    위는 테스트가 어떤 식으로 작동하는지 간단하게 알아보기 위한 코드이다.

     

    우리는 실질적으로 DMakerService 클래스를 테스트하고자 하기에 테스트 코드를 수정해준다.

     

    dmaker.service.DMakerServiceTest

    // @SpringBootTest 어노테이션을 달게 되면 이 테스트 안에서 
    // 현재 프로젝트에 등록된 모든 Bean을 사용하겠다는 의미이다.
    @SpringBootTest
    class DMakerServiceTest {
        // 우리가 실질적으로 테스트하고자 하는 클래스는 DMakerService이다.
        private DMakerService dMakerService;
    
        // 아래와 같이 DMakerService를 new로 선언하지 않고도 DMakerRepository 등을 사용할 수 있는 것은
        // DMaker에 각각의 클래스들이 Bean으로 등록되어있기 때문이다.
        // private DMakerService dMakerService = new DMakerService();
    
        @Test
        public void testSomething() {
            // refactor -> introduce variable을 통해 쉽게 알맞는 타입을 가진 변수명을 생성할 수 있다.
            List<DeveloperDto> allDevelopers = dMakerService.getAllDevelopers();
            System.out.println(allDevelopers);
        }
    }

    위와 같이 코드를 작성하고 실행을 시키게 되면 아직 DB에 등록된 데이터가 하나도 없기에 결과값이 존재하지 않는다.

    테스트를 위해 임시 데이터를 하나 넣어준다.

     

    dmaker.service.DMakerServiceTest

    @SpringBootTest
    class DMakerServiceTest {
    
        @Autowired
        private DMakerService dMakerService;
    
        @Test
        public void testSomething(Developer developer) {
            dMakerService.createDeveloper(CreateDeveloper.Request.builder()
                    .developerLevel(DeveloperLevel.SENIOR)
                    .developerSkillType(DeveloperSkillType.FRONT_END)
                    .experienceYears(12)
                    .name("name")
                    .age(32)
                    .build());
    
            List<DeveloperDto> allDevelopers = dMakerService.getAllDevelopers();
            System.out.println("=======================================");
            System.out.println(allDevelopers);
            System.out.println("=======================================");
        }
    }

    임시 데이터를 하나 삽입해준 뒤 allDevelopers 출력 시 등록한 developer가 출력되는 것을 확인할 수 있다.

     

    Mockito

    Mockito 또한 유닛 테스트에 사용할 수 있는 프레임워크로써 Spring Boot에 기본적으로 내장되어있다.

    아래와 같은 방법으로 Mockito를 이용해 테스트를 진행할 수 있다.

     

    dmaker.service.DMakerServiceTest

    // Mockito를 사용하기 위해 클래스에 어노테이션을 붙여준다.
    @ExtendWith(MockitoExtension.class)
    class DMakerServiceTest {
        
        // 가상의 Mock으로 테스트 시 DMakerService 안에 넣어준다.
        @Mock
        private DeveloperRepository developerRepository;
        
        @Mock
        private RetiredDeveloperRepository retiredDeveloperRepository;
        
        // DMakerService에 선언한 Mock들을 주입한다.
        @InjectMocks
        private DMakerService dMakerService;
    
        @Test
        public void testSomething(Developer developer) {
            given(developerRepository.findByMemberId(anyString()))
                    .willReturn(Optional.of(Developer.builder()
                            .developerLevel(SENIOR)
                            .developerSkillType(FRONT_END)
                            .experienceYears(12)
                            .name("name")
                            .age(12)
                            .build()));
    
            DeveloperDetailDto developerDetailDto = dMakerService.getDeveloperDetail("memberId");
            
            assertEquals(SENIOR, developerDetailDto.getDeveloperLevel());
            assertEquals(FRONT_END, developerDetailDto.getDeveloperSkillType());
            assertEquals(12, developerDetailDto.getExperienceYears());
        }
    }

     

     

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

     

    수강료 100% 환급 챌린지 | 패스트캠퍼스

    딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!

    fastcampus.co.kr

    댓글

Designed by Tistory.