1. SpringBoot 용어정리

  1. Mock
    1. Test Double이라 말하며, 실 사용되어야 하는 Object의 Alternate(대역)을 의미함
    2. 대상의 행위를 검증하는 데 있어서 사용하기 때문에 Object가 가지고 있어야 하는 기본적인 Info를 반드시 가지고 있음
    3. Mock Obejct를 직접 생성하는 경우도 있지만, Class를 계속해서 생성하기 어렵기에, Mockito라는 라이브러리를 이용하기 시작함
  2. Mockito
    1. JUnit위에서 동작하며 Mocking과 Verification을 도와주는 FrameWork임
    2. Developer가 동작을 직접 제어할 수 있는 가짜 Object를 지원하는 Test FrameWork라 생각하면됨
  3. Mockito 사용법
    1. Mock Object 의존성 주입
      1. Mock : 가짜 Object를 만들어 Return해주는 Annotation
      2. Spy : Stub하지 않은 Method들은 원본 Method 그대로 사용하는 Annotation
      3. InjectMocks : Mock or Spy로 생성된 가짜 Object를 Auto로 주입시켜주는 Annotation
    2. Stub로 결과 처리
      1. 가짜 Object를 주입하여 어떤 결과를 Return하라고 정해진 답변을 준비시킴
      2. doReturn() : 가짜 Object가 특정한 값을 Return해야하는 경우임
      3. doNothing() : 가짜 Object가 아무 것도 Return하지 않는 경우임(Void)
      4. doThrow() : 가짝 Object가 예외를 발생시키지 않는 경우임
    3. Mockito와 Junit의 결합
      1. Testing FrameWork이기에 JUnit과 결합되기 위해서는 별도의 작업이 필요함
      2. JUnit4에서 Mockito를 활용하기 위해서 Class Annotation으로 @RunWith(MockitoJUnitRunner.class)를 붙여줘야 연동이 가능했음
      3. SpringBoot 2.2.0 이후 공식적으로 JUnit5를 지원함에 @ExtendWith(MockitoExtension.class)를 사용해야 결합이 가능함
  4. Spring Controller Unit Test
    1. Unit Test 작성 준비
      1. Unit Test시 JUnit5, Mockito를 연동해주기 위해 **@ExtendWith(MockitoExtension.class)**를 사용함
      2. 의존성 주입을 통해서 Controller에서의 작업이 이루어지도록 @InjectMocks를 붙여줌
      3. Controller를 Test하기 위해 HTTP Call이 필요함 그래서 MockMVC에서 제공해주기에 MockMVC를 생성해줘 Test 환경을 마무리해줌
    2. Successful Test
      1. Given 단계는 Test를 위한 준비단계임
      2. Spring에서는 Request시, Json String을 Object로 Return해줌! 그래서 API로 전달되는 Paramter에서는 조작이 될 수 없어 에러가 뜸
      3. any() : 특정 Class의 Type을 지정해줘 Request되는 Parameter 처리등을 MockMVC에 맞게 Return 해줌 ⇒ when 단계
      4. Then 단계는 API Call시 200 Response와 Request 결과를 검증하는 것을 말함
    3. Client List Select Test
      1. @WebMvcTest
        1. MockMvc를 생성하는 등이 번거로울때, Controller Test를 위해 Annotation을 제공함
        2. MockMvc Object가 Auto로 생성될 뿐만 아니라, controllerAdvice나 Filter, Interceptor등 Web계층 Test에 필요한 Element들을 모두 Bean으로 등록해 Spring 컨텍스트 환경을 구성 할 수 있음!
        3. SpringBoot가 제공하는 Test환경이기에 Mock과 Spy대신 MockBean과 SpyBean을 사용해줘야함
  5. Spring Repository 계층 Unit Test
    1. @DataJpaTest
      1. JPA Repository를 손쉽게 Test할 수 있는 Annotation을 제공하며 기본적으로 InMemory DB 인 H2를 기반으로 Test DB를 구축하며, Test가 끝나면 트랜잭션을 롤백함
      2. Repository 계층은 실제 DB와 통신없이 단순 Mocking하는 것은 의미가 없으므로 직접 DB와 통신하는 @DataJpaTest가 탄생한 이유임