[Spring] Hamcrest , SliceTest
Categories: Spring
๐ ๊ฐ์ธ์ ์ธ ๊ณต๊ฐ์ผ๋ก ๊ณต๋ถ๋ฅผ ๊ธฐ๋กํ๊ณ ๋ณต์ตํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ธ๋ก๊ทธ์
๋๋ค.
์ ํํ์ง ์์ ์ ๋ณด๊ฐ ์์ ์ ์์ผ๋ ์ฐธ๊ณ ๋ฐ๋๋๋ค :๐ธ
[ํ๋ฆฐ ๋ด์ฉ์ ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์๋ฉด ๋ณต๋ฐ์ผ์ค๊ฑฐ์์]
Hamcrest
Hamcrest๋ฅผ ์ฌ์ฉํ๋ ์ด์
- Assertion์ ์ํ ๋งค์ณ(Matcher)๊ฐ ์์ฐ์ค๋ฌ์ด ๋ฌธ์ฅ์ผ๋ก ์ด์ด์ง๋ฏ๋ก ๊ฐ๋ ์ฑ์ด ํฅ์๋๋ค.
- ํ ์คํธ ์คํจ ๋ฉ์์ง๋ฅผ ์ดํดํ๊ธฐ ์ฝ๋ค.
- ๋ค์ํ Matcher๋ฅผ ์ ๊ณตํ๋ค.
๋ฌธ๋ฒ
-
AssertThat
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.is; public class HelloHamcrestTest { @DisplayName("Hello Junit Test using hamcrest") @Test public void assertionTest1() { String expected = "Hello, JUnit"; String actual = "Hello, JUnit"; assertThat(actual, is(equalTo(expected))); // (1) } }
- assertThat(actual, is(equalTo(expected))); : โ๊ฒฐ๊ณผ ๊ฐ(actual)์ด ๊ธฐ๋ ๊ฐ(expected)๊ณผ ๊ฐ๋ค๋ ๊ฒ์ ๊ฒ์ฆ(Assertion)โ
- assertThat() ๋ฉ์๋์ ํ๋ผ๋ฏธํฐ
- ์ฒซ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ : ํ ์คํธ ๋์์ ์ค์ ๊ฒฐ๊ณผ ๊ฐ
- ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ : ๊ธฐ๋ํ๋ ๊ฐ์ ๋๋ค. ์ฆ, ์ด๋ฐ ๊ฐ์ผ ๊ฑฐ๋ผ๊ณ ๊ธฐ๋(์์)ํ๋ ๊ฐ
-
Not Null ํ ์คํธ : Hamcrest์
is()
,notNullValue()
๋งค์ณ๋ฅผ ํจ๊ป ์ฌ์ฉ
์ฌ๋ผ์ด์ค ํ ์คํธ(Slice Test)
- ๊ฐ๋ฐ์๊ฐ ๊ฐ ๊ณ์ธต์ ๊ตฌํํด ๋์ ๊ธฐ๋ฅ๋ค์ด ์ ๋์ํ๋์ง ํน์ ๊ณ์ธต๋ง ์๋ผ์(Slice) ํ ์คํธํ๋ ๊ฒ์ ์ฌ๋ผ์ด์ค ํ ์คํธ
- ์ ํ๋ฆฌ์ผ์ด์ ์ ํน์ ๊ณ์ธต(์: ์น ๊ณ์ธต, ์๋น์ค ๊ณ์ธต ๋ฑ)๋ง์ ํ ์คํธํ๊ธฐ ์ํ ๋ฐฉ๋ฒ.
- ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ ๋น ๋ฅด๊ณ ํจ์จ์ ์ด๋ค.
API ๊ณ์ธต ํ ์คํธ
๊ธฐ๋ณธ ๊ตฌ์กฐ(with @SpringBootTest , @AutoConfigureMockMvc)
@SpringBootTest
@SpringBootTest
์ ๋ํ ์ด์ ์ Spring Boot ๊ธฐ๋ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ ์คํธํ๊ธฐ ์ํ Application Context๋ฅผ ์์ฑํ๋ค.- ์คํ๋ง ๋ถํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฒด ์ปจํ ์คํธ๋ฅผ ๋ก๋ํ์ฌ ํตํฉ ํ ์คํธ๋ฅผ ์ํํ ์ ์๋๋ก ํด์ค (๋ชจ๋ Bean์ ๋ก๋ํ๊ธฐ ๋๋ฌธ์ ๋ฌด๊ฑฐ์)
-
๊ฒฐ๊ตญ ํด๋น ์ ๋ํ ์ด์ ์ด ๋ถ์ผ๋ฉด ์คํ๋ง๋ถํธ์ ๋์์ ๋ฐ๊ฒ ์ต๋๋ค ์ฆ ,์คํ๋ง์ ์ฝ์ด ๊ธฐ๋ฅ์ ์ฐ๊ฒ ๋ค๋ ๋ป
โ ๊ทธ๋์ @Autowired ์ฌ์ฉํ ์ ์๋ ๊ฒ์.
โ Autowired ๋ ํ๋ ์ฃผ์ : ํ๋ ์ฃผ์ ์ ์ฌ์ฉํ์ง ๋ง๋ผ๊ณ ํ์ง๋ง ํ ์คํธ ํ๊ฒฝ์์๋ ๋ง์ด ์ฌ์ฉํ๋ค
@AutoConfigureMockMvc
- ํ๊ฒฝ์ค์ ์ ํด์ฃผ๋๊ฒ.( Controller ํ ์คํธ๋ฅผ ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ ๊ตฌ์ฑ ์์ ์ ํด์ค๋ค.)
- MockMVC๋ฅผ ์๋์ผ๋ก ๊ตฌ์ฑํ์ฌ ํ ์คํธ์์ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค๋ค
- API ๊ณ์ธต๊ณผ ์๋ธ๋ฆฟ
- ์คํ๋ง๋ถํธ๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ผ๋ ํ๊ฒฝ์์ด๋ ์คํํ ์์๋ค, ์๋๋ฉด ์๋ธ๋ฆฟ์ด ์์ฒญ๊ณผ ์๋ต์ ๋ด๋นํ๊ณ ์๊ธฐ ๋๋ฌธ์
- ์๋ธ๋ฆฟ. ํ๋์ ์๋ธ๋ฆฟ ๊ฐ์ฒด(์๋ฐ์์ ์น ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๊ฐ์ฒด)๊ฐ ์คํ
-
์๋ธ๋ฆฟ์ ๋ด๋นํ๋๊ฒ ์๋ธ๋ฆฟ ์ปจํ ์ด๋ (= tomcat)
- ๋์คํจ์ฒ ์๋ธ๋ฆฟ ์์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ์์. was๋ผ๊ณ ๋ํ๊ณ tomcat์ด๋ผ๊ณ ๋ ํจ.
- ์น์ ์์ฒญ์ ์ํํ๋ ์ญํ ์ ๋ด๋นํ๋ ๊ฒ์ด ์๋ธ๋ฆฟ์ด๊ณ . ์ด๊ฑธ ๋ด๋นํ๋๊ฒ ์๋ธ๋ฆฟ ์ปจํ ์ด๋ (์๋ธ๋ฆฟ์ปจํ ์ด๋์ ๋ํ์ ์ธ ์ : ํฐ์บฃ)
- ๊ฒฐ๊ตญ API๊ณ์ธต์์ ์๋ธ๋ฆฟ์ ํ์ , ์๋ฅผ ๊ด๋ฆฌํ๋ ์ฃผ์ฒด๊ฐ ํ์ํจ
- ์ฌ๋ผ์ด์ค ํ ์คํธ๋ฅผ ํ๊ธฐ์ํด์๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ํ์๋ก ํ์ํจ โ? ์๋๋ฉด ๊ฑฐ๊ธฐ๊น์ง ๋ณด๋ด์ฃผ๋ ์ ๊ฐ ์๊ธฐ ๋๋ฌธ์.
- MockMVC ๋ ๊ฐ์ง๋ก MVC์ ๊ตฌ์กฐ๋ฅผ ๋ํ๋, ์ค์ ๋ก ์๋ธ๋ฆฟ ์์ด API ๊ณ์ธต์๊ฒ ์์ฒญ๊ณผ ์๋ต์ ๋ณด๋ด๋ ์ญํ ์ ํ๋ค.
- ํ ์คํธ ํ ๋๋ง๋ค ํฐ์บฃ์ ์คํํ๋ฉด ๋งค๋ฒ ๋ง์ ๋ฆฌ์์ค๊ฐ ๋ค์ด๊ฐ๊ฒ ๋๋ MockMVC๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์ฃผ์ ์ด ํ์ํจ.
- ๊ทธ๋์ ํ๊ฒฝ์ค์ ์ด ํ์ํด์ AutoConfigureMockMVC์ SpringBootTest ์ ๋ํ
์ด์
์ด ํ์ํ๊ฒ ๋๋ค.
** -
๐ ์ฐธ๊ณ
์๋ธ๋ฆฟ(Servlet)
- ์๋ฐ์์ ์น ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๊ฐ์ฒด
- ํด๋ผ์ด์ธํธ์ HTTP ์์ฒญ์ ๋ฐ์์ ์ ์ ํ ์๋ต์ ์์ฑํ๋ ์ญํ ์ ํฉ๋๋ค.
์๋ธ๋ฆฟ ์ปจํ ์ด๋(Servlet Container)
- ์๋ธ๋ฆฟ์ ๊ด๋ฆฌํ๊ณ ์คํํ๋ ํ๊ฒฝ
- ๋ํ์ ์ธ ์๋ก Tomcat
- ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์น ์๋ฒ์ ์๋ธ๋ฆฟ ์ฌ์ด์ ํต์ ์ ๊ด๋ฆฌํ๋ฉฐ, ์๋ธ๋ฆฟ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌ
DispatcherServlet
- ์คํ๋ง MVC์ ํต์ฌ ์๋ธ๋ฆฟ์ผ๋ก, ๋ชจ๋ HTTP ์์ฒญ์ ๋ฐ์ ์ ์ ํ ์ปจํธ๋กค๋ฌ๋ก ์์ฒญ์ ์ ๋ฌํ๊ณ , ์๋ต์ ์์ฑ
MockMVC
- ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ฅผ ์คํํ์ง ์๊ณ ๋ ์คํ๋ง MVC์ ๋์์ ํ ์คํธํ ์ ์๋ ๋๊ตฌ
- MockMVC๋ฅผ ์ฌ์ฉํ๋ฉด ์ค์ ์๋ฒ๋ฅผ ์คํํ์ง ์๊ณ ๋ ์ปจํธ๋กค๋ฌ์ ๋์์ ํ ์คํธํ ์ ์๋ค.
- MokcMvc
MockMvc
๋ Tomcat ๊ฐ์ ์๋ฒ๋ฅผ ์คํํ์ง ์๊ณ Spring ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ Controller๋ฅผ ํ ์คํธํ ์ ์๋ ์๋ฒฝํ ํ๊ฒฝ์ ์ง์ํด ์ฃผ๋ ์ผ์ข ์ Spring MVC ํ ์คํธ ํ๋ ์์ํฌ- MockMvc๋ก ํ
์คํธ ๋์ Controller์ ํธ๋ค๋ฌ ๋ฉ์๋์ ์์ฒญ์ ์ ์กํ๊ธฐ ์ํด์๋ ๊ธฐ๋ณธ์ ์ผ๋ก
perform()
๋ฉ์๋๋ฅผ ๋จผ์ ํธ์ถ ํด์ผ ํจ. (์๋ postMember( ) ์์ ์ then ๋ถ๋ถ ์ฐธ๊ณ ) - MockMvcRequestBuilders ํด๋์ค๋ฅผ ์ด์ฉํด์ ๋น๋ ํจํด์ ํตํด request ์ ๋ณด๋ฅผ ์ฑ์ ๋ฃ์ ์ ์๋ค.
- MockMvc์
perform()
๋ฉ์๋๊ฐ ๋ฆฌํดํ๋ResultActions
ํ์ ์ ๊ฐ์ฒด๋ฅผ ์ด์ฉํด์ request์ ๋ํ ๊ฒ์ฆ์ ์ํ ๊ฐ๋ฅ
MemberCotroller ํ ์คํธ โ HTTP Post request์ ๋ํ ํ ์คํธ
-
Gson ์ถ๊ฐ
-
MemberDto ํด๋์ค
๊ธฐ์กด Dtoํด๋์ค๋ ๋ค ๋๋ ์ ธ ์์๋๋ฐ ํ๋์ dtoํด๋์ค์ post/patch/response๋ฅผ ์ด๋ํด๋์ค๋ก ํตํฉํด์ ๋ง๋ค์ด ๋์
-
MemberController์ postMember() ํ ์คํธ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
package com.springboot.member.controller; //... ...import com.google.gson.Gson; //... @SpringBootTest @AutoConfigureMockMvc class MemberControllerTest { @Autowired private MockMvc mockMvc; @Autowired private Gson gson; @Test void postMemberTest() throws Exception { //(1) given MemberDto.Post post = new MemberDto.Post ("jerry@gmail.com", "๋ฐ์ ๋ฆฌ", "010-1111-1111"); String content = gson.toJson(post); //(2) when //์ค์ api ์์ฒญ์ ๋ณด๋ด๋ ๊ฒ๊ณผ ์ ์ฌํ๊ฒ ํ ์คํธ๋ฅผ ์งํ ResultActions actions = mockMvc.perform( //(3) post("/v11/members") .accept(MediaType.APPLICATION_JSON) //์๋ต์ JSON .contentType(MediaType.APPLICATION_JSON) .content(content) ); //then actions.andExpect(status().isCreated()) .andExpect(header().string("Location",is(startsWith("/v11/members/")))); } }
1๏ธโฃ Given
-
Postman์ ์ฌ์ฉํ ๋ request body์ ํฌํจ์ํค๋ ์์ฒญ ๋ฐ์ดํฐ์ ๋์ผํ ์ญํ
-
Postman ์ฌ์ฉ์ JSON ํฌ๋งท์ผ๋ก ๋ฐ๋์ ํฌํจ์์ผฐ๋ ๊ฒ์ฒ๋ผ Gson์ด๋ผ๋ JSON ๋ณํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด MemberDto.Post ๊ฐ์ฒด๋ฅผ JSONํฌ๋งท์ผ๋ก ๋ณํ
2๏ธโฃ When
- perform()๋ฉ์๋ ํธ์ถ โ MockMvc๋ก Controller์ ํธ๋ค๋ฌ๋ฉ์๋์ ์์ฒญ์ ์ ์กํ๊ธฐ ์ํด์ ํ์ํจ, perform ๋ด์๋ ํธ์ถ์ ์ํ ์ธ๋ถ์ ์ธ ์ ๋ณด๋ค์ด ํฌํจ๋๋ค.
- (3)๋ถํฐ๋ HTTP request์ ๋ํ ์ ๋ณด์ด๋ฉฐ, MockMvcRequestBuilders ํด๋์ค๋ฅผ ์ด์ฉํด์ ๋น๋ ํจํด์ ํตํด request ์ ๋ณด๋ฅผ ์ฑ์ ๋ฃ์ ์ ์๋ค.
- post() ๋ฅผ ํตํด HTTP POST METHOD์ request URL์ ์ค์
- accept() ๋ฉ์๋๋ฅผ ํตํด ํด๋ผ์ด์ธํธ ์ชฝ์์ ๋ฆฌํด ๋ฐ์ ์๋ต ๋ฐ์ดํฐ ํ์ ์ผ๋ก JSON ํ์ ์ ์ค์ (๋ฐ์ดํฐ๋ JSON ํ์ ์ผ๋ก ๋ฐ์๊ฑฐ์ผ)
- contentType() ๋ฉ์๋๋ฅผ ํตํด ์๋ฒ ์ชฝ์์ ์ฒ๋ฆฌ ๊ฐ๋ฅํ Content Type์ผ๋ก JSON ํ์ ์ ์ค์ (์ฐ๋ฆฌ๊ฐ ๋ณด๋ด๋ ๋ฐ์ดํฐ๋ JSON ํ์ ์ผ๋ก ๋ณด๋ผ๊ฑฐ์ผ)
- content() ๋ฉ์๋๋ฅผ ํตํด request body ๋ฐ์ดํฐ๋ฅผ ์ค์
3๏ธโฃ Then
- MockMvc์ perform() ๋ฉ์๋๋ ResultActions ํ์ ์ ๊ฐ์ฒด๋ฅผ ๋ฆฌํดํ๋๋ฐ, ์ด ResultActions ๊ฐ์ฒด๋ฅผ ์ด์ฉํด์ ์ฐ๋ฆฌ๊ฐ ์ ์กํ request์ ๋ํ ๊ฒ์ฆ์ ์ํ
-
[ResultActions ์ธํฐํ์ด์ค โ andExpect๋ผ๋ ๋ฉ์๋๋ฅผ ํตํด ๊ฒ์ฆ]
- andExpect() ๋ฉ์๋๋ฅผ ํตํด ํ๋ผ๋ฏธํฐ๋ก ์ ๋ ฅํ ๋งค์ฒ(Matcher)๋ก ์์๋๋ ๊ธฐ๋ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ฆ, ํด๋น ๋ฉ์๋๋ throw๋ก ์์ธ๋ ํจ๊ป ๋์ ธ์ผ ํ๋ค!
status().isCreated()
๋ฅผ ํตํด response status๋ฅผ ๋งค์น- (header().string(โLocationโ,is(startsWith(โ/v11/members/โ)) โ HTTP header์ ์ถ๊ฐ๋ Location์ ๋ฌธ์์ด ๊ฐ์ด
โ/v11/members/โ
๋ก ์์ํ๋์ง ๊ฒ์ฆ
-
-
์ค์ ๊ฒฐ๊ณผ
-
Body์ status ๊ฐ ํ์ธ ํด์ผ ํจ. Postman์ฌ์ฉํ ๋์ ๋ง์ฐฌ๊ฐ์ง๋ก @Valid ๊ฒ์ฆ์ด ๋ค์ด๊ฐ์ ์ค๋ฅ๊ฐ ๋จ๋ ๊ฒ.
-
ํ ์คํธ ์คํ์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ๋ํ ๋ด์ฉ์ด ์์.
-
cotroller์ ํ ์คํธ๋ง ํด์ผํ๋๋ฐ Hibernate์ ๋์์ ๋ฐ๊ณ ์์.
-
MemberCotroller ํ ์คํธ โ HTTP get request์ ๋ํ ํ ์คํธ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@Test
void getMemberTest() throws Exception {
//Given , ์์ ์์ฑํ๋ postMember()๋ฅผ ์ด์ฉํ ํ
์คํธ ๋ฐ์ดํฐ ์์
MemberDto.Post post = new MemberDto.Post("jerry@gmail.com","wpfl","010-5555-5555");
String content = gson.toJson(post);
ResultActions postActions= mockMvc.perform(post("/v11/members")
.accept(MediaType.APPLICATION_JSON)
.contentType(MediaType.APPLICATION_JSON)
.content(content));
postActions.andExpect(status().isCreated())
.andExpect(header().string("Location", is(startsWith("/v11/members"))));
//"v11/member/1"
String location = postActions.andReturn().getResponse().getHeader("Location");
//when then
ResultActions response = mockMvc.perform(get(location).accept(MediaType.APPLICATION_JSON));
response.andExpect(status().isOk())
.andExpect(jsonPath("$.data.email").value(post.getEmail()))
.andExpect(jsonPath("$.data.name").value(post.getName()))
.andExpect(jsonPath("$.data.phone").value(post.getPhone()));
//get ์์ฒญ์ ๋ณด๋ด์ผํ๋ค db์ ๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์๋์ง
}}
1๏ธโฃ Given
- postMember()์ ๋์ผํ ์ฝ๋, ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ๋ฐฑ์๋ ์๋ฒ ์ธก์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋จผ์ ์ ์ฅ
postActions.andReturn().getResponse().getHeader("Location")
๋ก ์ ๊ทผํด์ Location header์ ๊ฐ์ ์ป์ด ์ฌ ์ ์์
2๏ธโฃ When
- location header ๊ฐ์ get์ URI๋ก ์ ๋ฌ
- Location header์์ ์ป๊ฒ ๋๋ ๊ฐ์ด given์์ ๋ฑ๋กํ ํ์์ ๋ณด์ ์์น๋ฅผ ์๋ฏธ (
โ/v11/members/1โ
)
3๏ธโฃ Then
- ๊ธฐ๋ํ๋ Http statusrk 200 OK์ธ์ง ๊ฒ์ฆ
- jsonPath()๋ฉ์๋๋ฅผ ํตํด response body(JSON ํ์)์ ๊ฐ ํ๋กํผํฐ๋ก ์๋ต๋ฐ๋ ๋ฐ์ดํฐ๊ฐ response body๋ก ์ ์กํ ๊ฐ๊ณผ ์ผ์นํ๋์ง ๊ฒ์ฆ
โ๏ธ ํ ์คํธ ๊ฒฐ๊ณผ
-
์ ๋ถ ํ ์คํธ ํ๋ฉด get๋ง ํต๊ณผํจ ์๋๋ฉด postํ Member๋ ์ด๋ฏธ ์กด์ฌํ๋ ๋ฉค๋ฒ์ด๊ธฐ ๋๋ฌธ
-
@Transactional ์ถ๊ฐ์ ๋ชจ๋ ํต๊ณผํจ. โ ๋ช๊ฐ์ง ๋ฌธ์ ๊ฐ ์์.
๐ค ๊ฐ๊ฐ์ Test ์ผ์ด์ค๋ ๋ ๋ฆฝ์ ์ธ ์ญํ ์ ํด์ผํ๋๋ฐ ์์น์ ๋ฒ์ด๋๊ณ ์์
- ์ฌ๋ผ์ด์คํ ์คํธ๋ ๋ ๋ฆฝ์ ์ผ ์ปจํธ๋กค๋ฌ๋ง์ ํ ์คํธํด์ผ๋๋๋ฐ DB๋ ์ ๊ทผํ๊ณ ์๊ณ , DB์ ์ ๊ทผํ๋ ค๋ฉด ์๋น์ค๋ ๊ฑฐ์ณ์ผ ํจ.
- controller service repository๊น์ง ๋ชจ๋ ๊ตฌํ๋์ด์ผ ํ ์คํธ ๊ฐ๋ฅ (Timely ๋ถ๊ฐ)
- ์ฌ์ค์ ์ฌ๋ผ์ด์คํ ์คํธ๋ผ๊ธฐ ๋ณด๋ค ์๋ธ๋ฆฟ์ ์ฌ์ฉํ์ง ์๋ ํตํฉํ ์คํธ๋ผ๊ณ ๋ณผ ์ ์์
โ๏ธ ์ด๋ฌํ ๋ฌธ์ ๋ค์ Mock(๊ฐ์ง) ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด ๊ณ์ธต ๊ฐ์ ์ฐ๊ฒฐ์ ๋์ด์ค์ผ๋ก์จ ํด๊ฒฐ์ด ๊ฐ๋ฅ โ ๋ค์์ ๋ฐฐ์ธ ๋ด์ฉ!
โ๏ธ @AutoConfigureMockMvc
๋ง๊ณ @webMvcTest ๋ผ๋ ๊ฒ๋ ์๋๋ฐ DI๋ฑ ์ค์ ํด์ค์ผ ํ ๊ฒ ๋ง์์ ํ
์คํธ ์ฝ๋์๋ ์ฌ์ฉํ์ง ์์โ ๋ฌธ์ํํ ๋ ๋์ค์ ์ฌ์ฉํ ๊ฒ.
๋ฐ์ดํฐ ์ก์ธ์ค ๊ณ์ธต ํ ์คํธ
๐ ๊ผญ ์งํค๊ธฐ : ๊ฐ๊ฐ์ TestCase๋ฅผ ์ํํ๊ณ ๋์๋ ๋กค๋ฐฑํด์ผ ํจ!
ํ ์คํธ ์ผ์ด์ค๋ ์ฌ๋ฌ ๊ฐ์ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์ผ๊ด์ ์ผ๋ก ์คํ์ํค๋๋ผ๋ ๊ฐ๊ฐ์ ํ ์คํธ ์ผ์ด์ค์ ๋ ๋ฆฝ์ฑ์ด ๋ณด์ฅ๋์ด์ผ ํ๋ค.
์ฆ, DB์ ์ํ๋ฅผ ํ ์คํธ ์ผ์ด์ค ์คํ ์ด์ ์ผ๋ก ๋๋๋ ค์ ๊นจ๋ํ๊ฒ ๋ง๋๋ ๊ฒ์ด ํ์
์์ - MemberRepository ํ ์คํธ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package com.springboot.member.repository;
import com.springboot.member.entity.Member;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import java.util.Optional;
import static org.junit.jupiter.api.Assertions.*;
@DataJpaTest //(1)
class MemberRepositoryTest {
@Autowired
private MemberRepository memberRepository;
@Test
public void saveMemberTest(){
//given
Member member = new Member();
//์ด๊ธฐํ ํ ๋ Id = 0; ์ด ๋ฉค๋ฒ์ id๋ ํญ์ 0์
//test ํ๊ฒฝ์์๋ ๊ธฐ๋ณธํค๋ ๊ฒ์ฆํ์ง ์๋ ๊ฒ์ด ์ข์.
member.setEmail("jerry@gmail.comn=");
member.setName("์ ๋ฆฌ");
member.setPhone("010-0430-0430");
//When
Member savedMember = memberRepository.save(member);
//then
assertNotNull(savedMember);
assertEquals(member.getEmail(), savedMember.getEmail());
assertEquals(member.getName(),savedMember.getName());
assertEquals(member.getPhone(),savedMember.getPhone());
}
@Test
public void findByEmailTest(){
//given
Member member = new Member();
member.setEmail("jerry@gmail.comn=");
member.setName("์ ๋ฆฌ");
member.setPhone("010-0430-0430");
//when
memberRepository.save(member);
Optional<Member> findMember = memberRepository.findByEmail(member.getEmail());
//repository๋ ๋ชจ๋ Optional ํ์
์ด์์.
//then
assertTrue(findMember.isPresent()); //null์ด ์๋์ง๋ฅผ ๊ฒ์ฆ
assertEquals(findMember.get().getEmail(), member.getEmail());
assertEquals(findMember.get().getPhone(),member.getPhone());
assertEquals(findMember.get().getMemberStatus(), member.getMemberStatus());
}
}
-
(1) @DataJpaTest
๋ฐ์ดํฐ ์ก์ธ์ค ๊ณ์ธต์ ํ์ํ ์๋ ๊ตฌ์ฑ์ ํ์ฑํ ํ๋ ๊ธฐ๋ฅ
- @Transactional ์ ๊ฐ์ง๊ณ ์์ด ํ๋์ ํ ์คํธ ์ผ์ด์ค ์คํ์ด ์ข ๋ฃ๋๋ ์์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ rollback ์ฒ๋ฆฌ๋๋ค. โ ์๋์ผ๋ก ๋กค๋ฐฑ๋จ.
- ํ
์คํธ ๋์ ํด๋์ค์ธ
MemberRepository
๋ฅผ DI ๋ฐ๋๋ค. - given : ํ ์คํธ ํ ํ์ ์ ๋ณด๋ฅผ ์ค๋น ํ
- when : repository์ ์ ์ฅ
- then : ํ์ ์ ๋ณด๊ฐ ์ ์ ์ฅ๋์๋์ง ๊ฒ์ฆ(Assertion)
Leave a comment