Spring test
์คํ๋ง ๋ถํธ์์๋ ๊ธฐ๋ณธ์ ์ธ ํ ์คํธ ์คํํฐ๋ฅผ ์ ๊ณตํ๋ค. ์คํํฐ์ ์ฌ๋งํ ํ ์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ๋ญ์ณ๋์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
spring-boot-testspring-boot-test-autoconfigure
์ ๋๊ฐ ๋ชจ๋์ด ํ
์คํธ ๊ด๋ จ ์๋ ์ค์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ณ , ์ผ๋ฐ์ ์ผ๋ก spring-boot-starter-test๋ก ๋ ๋ชจ๋์ ํจ๊ป ์ฌ์ฉํ๋ค.
dependencies {
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}๋จ์ ํ
์คํธ(JUnit)
Spring Boot์์ JUnit5๋ฅผ ์ด์ฉํด ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํด๋ณด๊ธฐ ์ ์ ๊ธฐ๋ณธ์ ์ธ ๋ด์ฉ์ ๋ํด์ ๋ค๋ฃจ๊ณ ๋์ด๊ฐ ๊ฒ์ด๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋จ์ ํ ์คํธ(Unit Test) ์ฝ๋๋ฅผ ์์ฑํ ๋ 5๊ฐ์ง ์์น์ ๊ฐ์กฐํ๋ค.
Fast : ํ ์คํธ ์ฝ๋๋ฅผ ์คํํ๋ ์ผ์ ์ค๋ ๊ฑธ๋ฆฌ๋ฉด ์๋๋ค.
Independent : ๋ ๋ฆฝ์ ์ผ๋ก ์คํ์ด ๋์ด์ผํ๋ค.
Repeatable : ๋ฐ๋ณต ๊ฐ๋ฅํด์ผํ๋ค.
Self Validation : ๋ฉ๋ด์ผ ์์ด ํ ์คํธ ์ฝ๋๋ง ์คํํด๋ ์ฑ๊ณต, ์คํจ ์ฌ๋ถ๋ฅผ ์ ์ ์์ด์ผํ๋ค.
Timely : ๋ฐ๋ก ์ฌ์ฉ ๊ฐ๋ฅํด์ผํ๋ค.
Junit
Junit์ Java์ ๋จ์ ํ ์คํ ๋๊ตฌ์ด๋ค.
๋จ์ ํ ์คํธ Framework์ค ํ๋
๋จ์ ๋ฌธ์ผ๋ก Test Case ์ํ๊ฒฐ๊ณผ๋ฅผ ํ๋ณํ๋ค.
Annotation์ผ๋ก ๊ฐ๊ฒฐํ๊ฒ ์ฌ์ฉ๊ฐ๋ฅํ๋ค.
Dependencies
spring boot 2.2.0 ์ดํ ๋ฒ์ ์์๋ Junit5๊ฐ ๊ธฐ๋ณธ์ผ๋ก ๋ณ๊ฒฝ๋์๋ค. Junit5๋ Java8 ๋ถํฐ ์ง์ํ๋ฉฐ, ์ด์ ๋ฒ์ ์ผ๋ก ์์ฑ๋ ํ ์คํธ ์ฝ๋์ฌ๋ ์ปดํ์ผ์ด ์ง์๋๋ค.
SpringBoot 2.2.0 ์ด์ ๋ฒ์ ์์ junit5 ์ค์
maven
gradle
Test ๋จ์
@SpringBootTest
ํตํฉ ํ ์คํธ, ์ ์ฒด
Bean ์ ์ฒด
@WebMvcTest
๋จ์ ํ ์คํธ, Mvc ํ ์คํธ
MVC ๊ด๋ จ๋ Bean
@DataJpaTest
๋จ์ ํ ์คํธ, Jpa ํ ์คํธ
JPA ๊ด๋ จ Bean
@RestClientTest
๋จ์ ํ ์คํธ, Rest API ํ ์คํธ
์ผ๋ถ Bean
@JsonTest
๋จ์ ํ ์คํธ, Json ํ ์คํธ
์ผ๋ถ Bean
@SpringBootTest๋ ํตํฉ ํ ์คํธ๋ฅผ ์ ๊ณตํ๋ ๊ธฐ๋ณธ์ ์ธ Spring Boot Test ์ด๋ ธํ ์ด์ ์ด๋ค. ์ฌ๋ฌ ๋จ์ ํ ์คํธ๋ฅผ ํ๋์ ํตํฉ๋ ํ ์คํธ๋ก ์ํํ ๋ ์ ํฉํ๋ค.@SpringBootApplication์ด ๋ถ์ ์ด๋ ธํ ์ด์ ์ ์ฐพ์ context๋ฅผ ์ฐพ๋๋ค.์ค์ ๊ตฌ๋๋๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋๊ฐ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ๋ฅผ ๋ก๋ํด ํ ์คํธํ๊ธฐ ๋๋ฌธ์ ํ๊ณ ์ถ์ ํ ์คํธ๋ฅผ ๋ชจ๋ ์ํํ ์ ์๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์์ ์ค์ ๋ ๋น์ ๋ชจ๋ ๋ก๋ํ๊ธฐ ๋๋ฌธ์ ์ ํ๋ฆฌ์ผ์ด์ ๊ท๋ชจ๊ฐ ํด์๋ก ๋๋ ค์ง๋ค.
properties : ํ ์คํธ ์คํ๋๊ธฐ์ {key,value} ํ์์ผ๋ก ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
value : ํ ์คํธ ์คํ ์ ์ ์ฉํ ํ๋กํผํฐ๋ฅผ ์ฃผ์ ํ ์ ์๋ค.
classes : ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ์ ๋ก๋ํ ํด๋์ค๋ฅผ ์ง์ ํ ์ ์๋ค. ๋ณ๋๋ก ์ค์ ํ์ง ์์ผ๋ฉด,
@SpringBootApplicationor@SpringBootConfiguration์ ์ฐพ์์ ๋ก๋ํ๋ค.
@ExtendWith๋ ํ์ฅ๊ธฐ๋ฅ์ ๊ตฌํํ๋ค.JUnit5์์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ์๋น์๊ฐ ์ด ๊ธฐ๋ฅ์ผ๋ก ์ง์๋๊ณ ์๋ค.
์ค์ ๊ธฐ๋ฅ์ด ํด๋น ์ด๋ ธํ ์ด์ ์ ํตํด์ ์คํ๋๋ค.
JUnit4์์ RunWith์ ์ ์ฌํ๋ค.
@ActiveProfiles๋ ์ํ๋ ํ๋กํ์ผ ํ๊ฒฝ ๊ฐ์ ๋ถ์ฌํ ์ ์๋ค.@Transactional: ํ ์คํธ๋ฅผ ๋ง์น๊ณ ๋์ ์์ ๋ ๋ฐ์ดํฐ๊ฐ ๋กค๋ฐฑ๋๋ค.
Mock ๊ฐ์ฒด
ํ ์คํธ์ ๋ชจ๋ ๊ฐ๋ณ์ ์ธ ์์ญ(์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ, ๋ฉ์์ง ๋ฏธ๋ค์จ์ด, ๋ฐ์ดํฐ๋ฒ ์ด์ค)์ ๊ด๋ฆฌํ๊ธฐ ์ด๋ ค์ฐ๋ฉฐ, ์ํธ์์ฉ์ ๋จ์ ํ ์คํธ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ค.
๋น์ฆ๋์ค ๋ก์ง์ ํ ์คํธํ ๋ชฉ์ ์ด๋ผ๋ฉฐ, ํด๋น ๋ก์ง์ด ์ํธ์์ฉํ๋ ๋ค์ํ ์์กด์ฑ์ ๋ชจ๋ ํ ์คํธํ ํ์๋ ์๋ค. Mock ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด ํ ์คํธ ํ๊ฒฝ์์ ํ์ํ ์์กด์ฑ์ ๋์ฒดํ๊ณ , ์ธ๋ถ ์์กด์ฑ์ ์ํฅ ์์ด ๋น์ฆ๋์ค ๋ก์ง์ ์คํํ ์ ์๋ค.
Stub์ ํ ์คํธ์์ ์ฌ์ฉ๋๋ ํ๋์ฝ๋ฉ๋ ๊ตฌํ์ฒด์ด๋ค. (Stub์ Mock ๊ฐ์ฒด๊ฐ ์๋)
Mockito
Mockito๋ ํ๋ก์ ๊ธฐ๋ฐ์ Mock๊ฐ์ฒด ํ๋ ์์ํฌ๋ก ํํ๊ตฌ๋ฌธ๊ณผ ๋ง์ ์ ์ฐ์ฑ์ ์ ๊ณตํ๋ค. Mockito๋ฅผ ์ฌ์ฉํด ํ์ธ์ด ํ์ํ ๋์์ ๋ชจํนํด ์ค์ํ ๋์๋ง ๊ฒ์ฆํ ์ ์๋ค.
MockMvc Test
MockMvc ๋ ๋ธ๋ผ์ฐ์ ์์ ์์ฒญ๊ณผ ์๋ต์ ์๋ฏธํ๋ ๊ฐ์ฒด๋ก์ ์น์์ ํ ์คํธํ๊ธฐ ํ๋ Controller ํ ์คํธ๋ฅผ ์ฉ์ดํ๊ฒ ํด์ค๋ค. ๋ํ ์ํ๋ฆฌํฐ ํน์ ํํฐ๊น์ง ์๋์ผ๋ก ํ ์คํธํด ์๋์ผ๋ก ์ถ๊ฐ/์ญ์ ๋ ๊ฐ๋ฅํ๋ค.
@WebMvcTest๋ก ํ
์คํธ๋ฅผ ํ ์ ์๋ค.
Book.java
Service
Controller
test
@WebMvcTest(BookController.class): ํ ์คํธํ ์ปจํธ๋กค๋ฌ๋ช ์ ๋ช ์ํด์ค๋ค.์ฌ๊ธฐ์
@Service์@WebMvcTest์ ์ ์ฉ ๋์์ด ์๋๋ค.BookService์ธํฐํ์ด์ฌ๋ฅด ๊ตฌํํ ๊ตฌํ์ฒด๋ ์์ง๋ง,@MockBean์ ์ ๊ทน์ ์ผ๋ก ํ์ฉํด ์ปจํธ๋กค๋ฌ ๋ด๋ถ์ ์์กด์ฑ ์์๋ฅผ ๊ฐ์ ๊ฐ์ฒด๋ก ๋์ฒด ํ๋ค. MockBean์ ์ค์ ๊ฐ์ฒด๋ ์๋์ง๋ง ์ค์ ๊ฐ์ฒด์ฒ๋ผ ๋์ํ๊ฒ ๋ง๋ค ์ ์๋ค.given(bookService.getBookList()).willReturn(Collections.singletonList(book));: ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ดgiven()์ ์ฌ์ฉํด ๋ฉ์๋ ์คํ์ ๋ํ ๋ฐํ๊ฐ์ ๋ฏธ๋ฆฌ ์ค์ ํ๋ค.
๊ทธํ
andExpect()๋ก ์์ ๊ฐ์ด ๋์ค๋์ง์ ๋ํด์ ํ ์คํธ๋ฅผ ์งํํ๋ค.
๋ง์ฝ ๊ธฐ๋ณธ์ค์ ๋ง ํ์ํ๋ค๋ฉด @AutoConfigureMockMvc ์ผ๋ก ๊ฐ๋จํ๊ฒ ์ค์ ํ ์ ์๋ค.
ํ์ง๋ง AutoConfig๋ก ์ค์ ์ ํ๋ฉด Customํ๊ธฐ ์ด๋ ค์์ง๋ค. ์๋ ์ฝ๋๋ MockMvcBuilders๋ฅผ ํ์ฉํด MockMvc ์ธ์คํด์ค๋ฅผ ์์ฑํด์ฃผ์๋ค. ์ด๋ ๊ฒ ๊ณตํต ์ถ์ํด๋์ค๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ ์ ์๋ค.
์ด์ ์ถ์ ํด๋์ค๋ฅผ ์์๋ฐ์ Controller ํ ์คํธ๋ฅผ ์ํํ ์ ์๋ค.
@Test: ํ ์คํธ ๋์์ ์ง์ @Order: ํ ์คํธ ์ํ ์์ ์ง์ @TestMethodOrder(OrderAnnotation.class): OrderAnnotation ๊ธฐ์ค์ผ๋ก ํ ์คํธ ์ํ
์ฐธ์กฐ
Last updated
Was this helpful?