기능 테스트 : 단위가 가장 큰 테스트. 주로 사용자 입장에서 애플리케이션이 제공하는 기능이 올바르게 동작하는지를 테스트한다.
일반적으로 테스트 전문 부서(QA 부서) / 외부 QA 업체 / Frontend 개발자가 테스트를 실행.
통합 테스트 : 클라이언트 측 툴 없이 개발자가 짜 놓은 테스트 코드를 실행시켜서 이루어진다. 개발자/개발팀이 테스트의 주체가 되는것이 일반적이다.
슬라이스(slice) 테스트 : 애플리케이션을 특정 계층으로 쪼개어서 하는 테스트
단위 테스트 : 주로 서비스 계층의 비즈니스 로직의 클래스들이 독립적으로 테스트하기 가장 좋은 대상이기 때문에 단위 테스트라고 부르는 경우가 가장 많다.
=> 주로 메서드 단위로 테스트코 드를 작성한다. 일반적으로 단위 테스트는 최대한 독립적인 것이 좋고, 최대한 작은 단위인 것이 더 좋다.
단위 테스트를 위한 F.I.R.S.T 원칙이라는 것이 존재하는데,
이는
Fast(빠르게),Independent(독립적으로),Repeatable(반복 가능하도록),Self-validating(셀프 검증이 되도록),Timely(시기 적절하게)를 뜻한다.
여기서 Tiemly는 단위 테스트가 테스트 하려는 기능 구현을 하기 직전에 작성해야 한다는 의미이다. 구현하고자 하는 기능을 단계적으로 조금씩 업그레이드하면서 그때 그때 테스트 케이스 역시 단계적으로 업그레이드 하는 방식이 더 나은 경우가 많다.
Mock 객체를 생성하고, 해당 Mock 객체가 진짜처럼 동작하게 하는 역할을 수행하는 Mocking 라이브러리
Mock 객체를 사용하면
=> 다른 계층에 의존하지 않고 특정 계층의 테스트만 수행 가능

@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) 객체의 프로퍼티에 접근할 수 있으며, 이 값과 기대하는 값을 비교하여 올바른 응답이 왔는지 검증한다.

@ExtendWith(MockitoExtension.class) : Spring을 사용하지 않고, JUnit에서 Mockito의 기능을 사용할 수 있도록 해준다. @SpringBootTest 애너테이션을 사용할 수도 있지만, 기본적으로 가벼운 단위테스트 시에는 적합하지 않기 때문에 사용하지 않는다.
@Mock : mock 객체를 생성한다.
@InjectMocks : 해당 애노테이션을 추가한 필드에 Mock 객체를 주입해준다.
여기서는 Mock 객체인 MemberRepository를 MemberService에 주입해준다.

@DataJpaTest : Repository의 기능을 사용하기 위한 설정(Configuration)을 자동으로 추가해준다.
또한, @Transactional 애노테이션을 포함하고 있어, 각 테스트 종료시점에 테스트에 사용된 데이터들을 Rollback 해준다.