์ด๋ฒ์ ํ ์คํธ ์ฝ๋์ ์ค์์ฑ์ ๋ํด ์ธ์งํ๊ฒ ๋์ด์ ํ์ฌ ํ๋ก์ ํธ์ ํ ์คํธ ์ฝ๋๋ฅผ ๋์ ํด๋ณด์๋ค. Junit5๋ฅผ ์ฌ์ฉํ์๊ณ ๋จ์ ํ ์คํธ ๋ณด๋ค๋ ์ฐ์ ํตํฉ ํ ์คํธ๋ฅผ ๋จผ์ ๊ตฌํํ์ฌ ๋ณด์๋ค. ํด๋น ๊ธ์์๋ ํตํฉ ํ ์คํธ ํ๊ฒฝ ๊ตฌ์ถ์ ์ํ ์ ๋ณด๋ฅผ ๋ค๋ฃจ๊ณ ์์ต๋๋ค.
ํ ์คํธ ์ฝ๋์ ์ฉํ๊ธฐ ์ ์ ์ฐ์ ํ ์คํธ๋ฅผ ์ฝ๊ฒ ๋์์ค ํด๋์ค๋ฅผ ๋จผ์ ๋ง๋ค์ด ๋ณด์๋ค.
์ฐ์ ํด๋น ์ฝ๋๋ฅผ ๋ณด๊ธฐ์ ์ ํด๋น ํด๋์ค์ ๋ชฉ์ ์ ์์๋ณด๊ฒ ๋ค. ํด๋น ํด๋์ค์ ๋ชฉ์ ์ ํฌ๊ฒ 2๊ฐ์ง๊ฐ ์กด์ฌํ๋ค.
์ฌ๊ธฐ์ mockmvc๋?
๊ณต์ ๋ฌธ์์ ๋ณด๋ฉด ์๋์ ๊ฐ์ด ์ค๋ช ๋์ด์๋ค.
Main entry point for server-side Spring MVC test support.
ํด์ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ป์ด ๋๋ค.
์๋ฒ์ธก Spring MVC ํ ์คํธ ์ง์์ ์ํ ์ฃผ์ ์ง์ ์
๊ณต์ ๋ฌธ์
๊ทธ๋์ mockmvc์ ์ญํ ์?
ํ ์คํธ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ด์ ์๋ ์ฝ๋๋ฅผ ์์ฑํ ํ postman์ ํตํ์ฌ ์ง์ ํด๋น api๋ฅผ ํธ์ถํ์ฌ ์ํ๋ ๊ฐ์ด ๋ํ๋๋์ง ํ์ธํ์๋ค. ์ด๋ฌํ postman๊ณผ ๊ฐ์ ์ญํ ์ ํ ์ ์๋ ๊ฒ์ด mockMvc๋ผ๊ณ ๋ณผ ์ ์๋ค. http method์ค get์ ์ฌ์ฉํ ์ง post๋ฅผ ์ฌ์ฉํ ์ง ์ ํํ๊ณ url์ ์ ๋ ฅํ๊ณ ํ์์ ๋ฐ๋๋ query string์ ํตํด ์ธ์๋ฅผ ๋๊ฒจ์ค ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ํด๋น ๊ฒฐ๊ณผ๊ฐ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋์ง ํ์ธํ ์ ์๋ค.
์ด๋ป๊ฒ ์ฌ์ฉํ ๊ฒ์ธ๊ฐ?
@SpringBootTest
@AutoConfigureMockMvc
mockmvc๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ ์ ์ด๋ ธํ ์ด์ ์ ํ์ฉํ์๋ค.
@SpringBootTest ์ด๋ ธํ ์ด์ ์ด๋ ?
Spring Boot ๊ธฐ๋ฐ ํ ์คํธ๋ฅผ ์คํํ๋ ํ ์คํธ ํด๋์ค์ ์ง์ ํ ์ ์๋ ์ด๋ ธํ ์ด์ ์ด๋ค.
์ ์ด๋ ธํ ์ด์ ์ ํตํด์ ์ค์ spring boot๊ฐ ์คํ๋ ๋ ๋ฑ๋ก๋๋ bean๋ค์ด ์ค์ ํ๊ฒฝ์์ ๋์๊ฐ๋ฏ ์คํ๋ง ์ปจํ ์ด๋ ์๋ก ๋ชจ๋ ์ฌ๋ผ๊ฐ ํ ์คํธ๋ฅผ ํ๊ฒ ๋๋ค.
์ฅ์
๋จ์
@AutoConfigureMockMvc์ด๋?
MockMvc์ ์๋ ๊ตฌ์ฑ์ ํ์ฑํํ๊ณ ๊ตฌ์ฑํ๊ธฐ ์ํด ํ ์คํธ ํด๋์ค์ ์ ์ฉํ ์ ์๋ ์ฃผ์
mockMvc๋ฅผ ์ฌ์ฉํ ๋ ์๋๋ฅผ ๋์ด๊ธฐ ์ํด์ ํน์ ํด๋์ค๋ฅผ ์ง์ ํ์ฌ์ ํด๋น ๋ถ๋ถ๋ง ๋ก๋ํ๋ ๋ฐฉ์๋ ์์ง๋ง ํด๋น ๋ฐฉ์์ผ๋ก ์งํํด๋ณด๋ค ๋น ๋ฑ๋ก ๋ฌธ์ ๋๋ฌธ์ ์์ ์ด๋ ธํ ์ด์ ์ ํ์ฉํ์ฌ ๋ณด์๋ค. ์ฝ๊ฒ๋งํด mockMvc์ ๊ตฌ์ฑ์ ์๋์ผ๋ก ํ์ฑํ ํด์ฃผ๋ ์ด๋ ธํ ์ด์ ์ด๋ค.
์ด๋ ธํ ์ด์ ์ ๊ดํ ์ค๋ช ์ฐธ์กฐ
https://goddaehee.tistory.com/211
๊ทธ๋ฆฌ๊ณ ์ด๋ ธํ ์ด์ ์ค์ ๊ณผ mockMvc์ฌ์ฉ์ ์ํ ์ถ๊ฐ์ ์ธ ์ค์ ์ ์๋์ ๊ฐ์ด ์งํํ์๋ค.
fun applyEncodingFilter() {
this.mockMvc = MockMvcBuilders
.webAppContextSetup(this.ctx)
.apply<DefaultMockMvcBuilder>(springSecurity())
.addFilters<DefaultMockMvcBuilder>(
CharacterEncodingFilter("UTF-8", true),
).build()
}
@BeforeEach
fun setUp() {
applyEncodingFilter()
}
๋งค๋ฒ ์์ฒญํ ๋๋ง๋ค ์์๊ฐ์ด mockMvc๋ฅผ ์ด๊ธฐํ ํ๋ฉฐ ๋ํ์ ์ผ๋ก springSecurity ์ค์ ๊ณผ UTF-8 ์ธ์ฝ๋ฉ ์ค์ ์ ์งํํ๊ณ ์๋ค. ์์๊ฐ์ด ์ด๊ธฐํ ํ์ง์๊ณ ๊ทธ๋ฅ mockMvc ์์ฑ ์์ @Autowire๋ฅผ ๋ถ์ด๊ณ ์คํํ์ฌ ๋ณด์๋๋ฐ ๋์ค์ ํตํฉ ํ ์คํธ๋ฅผ ์งํํ ๋ ํ ์คํธ ๋ผ๋ฆฌ ์ถฉ๋ํ์ฌ ์คํจํ๋ ์ผ์ด์ค๊ฐ ๋ฐ์ํ์ฌ ์์๊ฐ์ด ๋งค๋ฒ ์ด๊ธฐํ ํ๋ ๋ฐฉ์์ผ๋ก ์งํํ์๋ค.
ํ ์คํธ๊ฐ ๊ฐ๋จํ๊ฒ ๋๋ฉด ์ข๊ฒ ์ง๋ง ๊ถํ์ด ํ์ํ API ๊ฐ์ ๊ฒฝ์ฐ ๊ฐ๋จํ๊ฒ ๋์ง ์๋๋ค. ๊ทธ๋์ mock ์ ์ ์ฃผ์ ์ ์ํ ์ค์ ์ด ํ์ํ๋ค. mock์ด๋ผ๋ ๋จ์ด๋ฅผ ์ฌ์ฉํ ์ด์ ๋ ๋จ์ด ๋ป ๊ทธ๋๋ก ๊ถํ์ด ํ์ํ ๊ฒฝ์ฐ๋ง ์ฌ์ฉํ๋ ์์ ์ ์ ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
mock ์ ์ ๋ฅผ ์์ฑํ๊ธฐ์ํด์ memberRepo์ passwordEncoder์ ์์กด์ฑ์ ์ฃผ์ ๋ฐ๋๋ค.
@Autowired
lateinit var memberRepo: MemberRepo
@Autowired
lateinit var passwordEncoder: PasswordEncoder
passwordEncoder๋ ์ ์ฌ์ฉํ๋์ง ์๋ฌธ์ด ๋ค ์ ์๋ค. passwordEncoder๋ฅผ ์ฌ์ฉํ ์ด์ ๋ ์ ์ ์ ๋ณด๋ฅผ db์ ์ ์ฅํ ๋๋ ๋น๋ฐ๋ฒํธ๋ฅผ ์ํธํ ํ์ฌ์ ์ ์ฅํ์ฌ์ผ ๋๊ธฐ ๋๋ฌธ์ด๋ค.
์ ์ ๋ฅผ ์์ฑํ๊ธฐ ์ํด์ @BeforeTransaction ์ด๋ ธํ ์ด์ ๊ณผ @AfterTransaction ์ด๋ ธํ ์ด์ ์ ํ์ฉํ์๋ค. ํ์ฉํ ํ ์คํธ ๋ฉ์๋ ์ด์ ์ ์ ์ ๊ฐ ์์ฑ๋์ด์ผ๋๊ธฐ ๋๋ฌธ์ด๋ค.
@BeforeTransaction ์ ๊ณต์ ์ค๋ช
@Transactional ์ฃผ์์ ํตํด ํธ๋์ญ์ ๋ด์์ ์คํ๋๋๋ก ๊ตฌ์ฑ๋ ํ ์คํธ ๋ฉ์๋์ ๋ํด ํธ๋์ญ์ ์ด ์์๋๊ธฐ ์ ์ ์ฃผ์์ด ๋ฌ๋ฆฐ ๊ณต์ฉ void ๋ฉ์๋๊ฐ ์คํ๋์ด์ผ ํจ์ ๋ํ๋ด๋ ํ ์คํธ ์ฃผ์. ์ํผํด๋์ค์ @BeforeTransaction ๋ฉ์๋๋ ํ์ฌ ํด๋์ค์ ๋ฉ์๋๋ณด๋ค ๋จผ์ ์คํ๋ฉ๋๋ค.
@BeforeTransaction
fun setUpAccount() {
val member = Member(
email = "test@naver.com",
password = passwordEncoder.encode("password"),
nickname = "nicktest",
username = "username",
birthDate = LocalDate.now(),
phone = "01012345678",
phoneKey = "ewuifhiwefheih2423r",
agePolicyConsent = true,
servicePolicyConsent = true,
personalInfoPolicyConsent = true,
smsConsent = false,
emailConsent = false
)
member.updateRole(Role.ADMIN)
testMember = memberRepo.save(member)
}
@AfterTransaction
fun cleanUpAccount() {
val member = memberRepo.findByEmail("test@naver.com")
member?.let{memberRepo.delete(it)}
}
beforeTransaction ์ด๋ ธํ ์ด์ ์ ์ด๋ฆ๊ณผ ๊ฐ์ด transaction์ ๊ฑธ์ด์ค์ผ์ง ํด๋น ๋ฉ์๋ ์ด์ ์ ์คํ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์์๊ฐ์ด ์์ฑํ ์ ์ ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ ์๋์ ๊ฐ์ด WithUserDetails ์ด๋ ธํ ์ด์ ์ ํ์ฉํ ์ ์๋ค.
@WithUserDetails(testUser)
์ฐธ์กฐ ๋ธ๋ก๊ทธ