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