(JUnit) 테스팅(Testing)과 Mockito

bagt13·2022년 8월 5일
0

Spring

목록 보기
2/11
post-thumbnail

테스트의 종류

  1. 기능 테스트 : 단위가 가장 큰 테스트. 주로 사용자 입장에서 애플리케이션이 제공하는 기능이 올바르게 동작하는지를 테스트한다.
    일반적으로 테스트 전문 부서(QA 부서) / 외부 QA 업체 / Frontend 개발자가 테스트를 실행.

  2. 통합 테스트 : 클라이언트 측 툴 없이 개발자가 짜 놓은 테스트 코드를 실행시켜서 이루어진다. 개발자/개발팀이 테스트의 주체가 되는것이 일반적이다.

  3. 슬라이스(slice) 테스트 : 애플리케이션을 특정 계층으로 쪼개어서 하는 테스트

  4. 단위 테스트 : 주로 서비스 계층의 비즈니스 로직의 클래스들이 독립적으로 테스트하기 가장 좋은 대상이기 때문에 단위 테스트라고 부르는 경우가 가장 많다.

=> 주로 메서드 단위로 테스트코 드를 작성한다. 일반적으로 단위 테스트는 최대한 독립적인 것이 좋고, 최대한 작은 단위인 것이 더 좋다.


FIRST 원칙

단위 테스트를 위한 F.I.R.S.T 원칙이라는 것이 존재하는데,

이는 Fast(빠르게), Independent(독립적으로), Repeatable(반복 가능하도록), Self-validating(셀프 검증이 되도록), Timely(시기 적절하게) 를 뜻한다.

여기서 Tiemly는 단위 테스트가 테스트 하려는 기능 구현을 하기 직전에 작성해야 한다는 의미이다. 구현하고자 하는 기능을 단계적으로 조금씩 업그레이드하면서 그때 그때 테스트 케이스 역시 단계적으로 업그레이드 하는 방식이 더 나은 경우가 많다.


Mockito란?

Mock 객체를 생성하고, 해당 Mock 객체가 진짜처럼 동작하게 하는 역할을 수행하는 Mocking 라이브러리

Mock 객체를 사용하면
=> 다른 계층에 의존하지 않고 특정 계층의 테스트만 수행 가능


Mock 객체를 이용한 슬라이스 테스트 예시

Controller 테스트

  • @SpringBootTest : SpringBoot 기반의 애플리케이션을 테스트하기 위한 ApplicationContext 를 생성해준다.

  • @AutoConfigureMockMvc : Controller 테스트를 위한 애플리케이션의 자동구성 작업을 수행해주며, MockMvc 같은 기능을 사용하기 위해서는 이 애너테이션을 반드시 추가해 주어야 한다.

  • MockMvc : 일종의 Spring MVC 테스트 프레임워크이며, WAS 없이 Controller 테스트 환경을 제공한다. 해당 객체를 사용하여 Controller 테스트를 진행할 수 있다.

  • @MockBean : ApplicationContext 에 등록되어 있는 Bean 에 대한 Mockito Mock 객체를 생성하고 주입하여 가짜 Mock 객체를 생성해준다.


  • Mockito가 제공하는 given 메서드를 이용하여 Stubbing 작업(임의의 객체를 만들어주는 작업)을 수행할 수 있다.

  • MockMvc 객체의 perform 메서드를 이용하여 WAS 없이 Controller에 요청을 보낼 수 있다.

  • 마지막으로 jsonPath 메서드를 이용하여 요청에 대한 응답(response) 객체의 프로퍼티에 접근할 수 있으며, 이 값과 기대하는 값을 비교하여 올바른 응답이 왔는지 검증한다.


Service 테스트

  • @ExtendWith(MockitoExtension.class) : Spring을 사용하지 않고, JUnit에서 Mockito의 기능을 사용할 수 있도록 해준다. @SpringBootTest 애너테이션을 사용할 수도 있지만, 기본적으로 가벼운 단위테스트 시에는 적합하지 않기 때문에 사용하지 않는다.

  • @Mock : mock 객체를 생성한다.

  • @InjectMocks : 해당 애노테이션을 추가한 필드에 Mock 객체를 주입해준다.
    여기서는 Mock 객체인 MemberRepository를 MemberService에 주입해준다.


Repository 테스트

  • @DataJpaTest : Repository의 기능을 사용하기 위한 설정(Configuration)을 자동으로 추가해준다.

  • 또한, @Transactional 애노테이션을 포함하고 있어, 각 테스트 종료시점에 테스트에 사용된 데이터들을 Rollback 해준다.

profile
주니어 백엔드 개발자입니다😄

0개의 댓글