์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |
- ToyProject
- python
- BFS
- ๋จ์ํ ์คํธ
- ํ์ด์ฌ
- ์นํฌ๋กค๋ง
- ํ๋ก๊ทธ๋๋จธ์ค
- OS
- ๋งคํธ๋ฉ
- matlab
- ์นด์นด์ค๊ธฐ์ถ
- ์ ๋ ๋์
- ํด์
- API
- ์ด์์ฒด์
- Crawling
- selenium
- ํฌ๋กค๋ง
- ํด์๋ฒ
- ๊ทธ๋ฆฌ๋
- ์์์ฒ๋ฆฌ
- ์ด์งํ์
- JPA
- ๋ฐฑ์ค
- Java
- ์๊ณ ๋ฆฌ์ฆ
- webcrawling
- ์นด์นด์ค
- spring
- ์ผ์ฑ๊ธฐ์ถ
DevKim
[Test Code] ๋จ์ ํ ์คํธ - Mockito & @MockMvcTest ๋ณธ๋ฌธ
๐ Mock์ ์ด์ฉํ ๋จ์ ํ ์คํธ ๐
โ ๋จ์ ํ ์คํธ VS. ํตํฉ ํ ์คํธ
- ๋จ์ ํ ์คํธ (Unit Test)
์ฅ์ : ํ๋์ ๋ชจ๋์ด๋ ํด๋์ค์ ๋ํด ์ธ๋ฐํ ๋ถ๋ถ๊น์ง ํ ์คํธ ๊ฐ๋ฅ
๋จ์ : ๋ชจ๋ ๊ฐ์ ์ํธ ์์ฉ ๊ฒ์ฆ ๋ชปํจ
- ํตํฉ ํ ์คํธ (Integration Test)
์ฅ์ : ๋ ๊ฐ ์ด์์ ๋ชจ๋์ด ์ฐ๊ฒฐ๋ ์ํ๋ฅผ ํ ์คํธ ๋ชจ๋ ๊ฐ์ ์ฐ๊ฒฐ์์ ๋ฐ์ํ๋ ์๋ฌ ๊ฒ์ฆ ๊ฐ๋ฅ
๋จ์ : ๋๋ฌด ๋ฌด๊ฑฐ์
์ง๊ธ๊น์ง, ํญ์ @SpringBootTest๋ฅผ ์ฌ์ฉํ์ฌ ํตํฉ ํ ์คํธ๋ง์ ์งํํ์๋ค.
์ฌ์ค ์ง๊ธ๊น์ง ํฐ ํ๋ก์ ํธ๋ ์งํํ์ ์ด ์๊ธฐ์, ๋ฌด๊ฒ๋ค๋ ๋๋์ ๋ง์ด ๋ชป ๋ฐ์๋๋ฐ
์ค๋ฌด์์ ๋จ์ ํ ์คํธ๊ฐ ๋น ๋ฅด๊ฒ ํ ์คํธ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ผ๋ฉด์๋ ๊ฐ์ฅ ํจ๊ณผ์ ์ด์ด์
์์ฃผ ์ฐ์ด๋ ๊ฒ ๊ฐ์ผ๋ ๋ฏธ๋ฆฌ ์ฐ์ตํด๋๋ ค๊ณ ํ๋ค.
์ค์ต์ ๊ฐ๋จํ CRUD ๊ธฐ๋ฅ์ ๋ง๋ค๊ณ ,
์ด๊ฒ์ ๊ฒ ์ฐพ์๋ณด๋ฉด์ ์ด์ ๋ํ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํด๋ณด์๋ค.
๋จ์ ํ ์คํธ๋ Mockito์ @MockMvcTest๋ฅผ ์ฌ์ฉํ์ฌ ํ์ตํ์๋ค.
๐ Mock ๊ฐ์ฒด๋?
- ์ค์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๊ธฐ์ ์๊ฐ, ๋น์ฉ ๋ฑ์ Cost๊ฐ ๋์๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ค.
- ๊ฐ์ง๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ๊ฐ์ง๊ฐ์ฒด๊ฐ ์ํ๋ํ์๋ฅผ ํ๋์ง๋ฅผ ๊ฒ์ฆํ๋ ๋ฐฉ์์ด๋ค.
๐ Controller Test ์ฝ๋ ์์ฑ๋ฒ
- MockMvc๋ฅผ ํตํด api๋ฅผ ํธ์ถํ๋ฉฐ ํด๋น์ปจํธ๋กค๋ฌ์์ ์์กดํ๊ณ ์๋ ๊ฐ์ฒด๋ฅผ Mock๊ฐ์ฒด๋ก ๋ง๋ค์ด ์ฃผ์ ํด์ค๋ค.(@MockBean ์ด๋ ธํ ์ด์ ์ฌ์ฉ)
- Mock ๊ฐ์ฒด๋ ๊ฐ์ง๊ฐ์ฒด์ด๋ฏ๋ก ๋ฆฌํด๋๋๊ฐ์ด ์์ผ๋ฏ๋ก, given & when ์ ์ฌ์ฉํ์ฌ ์ํ๋ ๊ฐ์ ๋ฆฌํด ํ๋๋ก ๋ฏธ๋ฆฌ ์ ์ํด์ค๋ค.
- ๋ก์ง์ด ์งํ๋ํ ํด๋น ํ์๊ฐ ์งํ๋๋์ง verify๋ฅผ ํตํด ๊ฒ์ฆํด์ค๋๋ค.
๐ POST Method Test - ๊ธ ๋ฑ๋ก ํ ์คํธ
@MockBean(JpaMetamodelMappingContext.class)
@WebMvcTest(HoneyPostApiController.class)
class HoneyPostApiControllerTest {
@Autowired
MockMvc mockMvc;
@MockBean
HoneyService honeyService;
@DisplayName("๊ธ ๋ฑ๋ก ํ
์คํธ")
@Test
public void createPost() throws Exception {
//given
HoneyPostApiDto honeyPostDto = HoneyPostApiDto.builder()
.title("this is title")
.author("juliekim")
.content("this is content")
.build();
//when
//then
mockMvc.perform(post("/api/honey")
.contentType(MediaType.APPLICATION_JSON)
.content(new ObjectMapper().writeValueAsString(honeyPostDto)))
.andExpect(status().isOk())
.andDo(MockMvcResultHandlers.print());
}
1. ์ ๋ฌํ DTO ์์ฑ
2. post ๋ฐฉ์์ผ๋ก ํด๋น url์ ์ ๋ฌ
3. JSON ํ์ ์์ ๋ช ์
.contentType(MediaType.APPLICATION_JSON)
4. Body ์์ญ์ ๋ฌธ์์ด๋ก ํํํ๊ธฐ ์ํด ObjectMapper์ ํตํด ๋ฌธ์์ด JSON์ผ๋ก ๋ณํ
.content(new ObjectMapper().writeValueAsString(honeyPostDto)))
5. ์๋ต ๋ฐ์ดํฐ ์ถ๋ ฅ
.andDo(MockMvcResultHandlers.print())
print๋ฅผ ํ๋ฉด ์ข ๋ ์ง๊ด์ ์ผ๋ก ํ์ธ๊ฐ๋ฅํ๋ค.
๐ Get Method Test - ๋จ๊ฑด ์กฐํ
@DisplayName("๊ธ ์์ธ ์กฐํ ํ
์คํธ")
@Test
public void findOne() throws Exception{
//given
HoneyPost honeyPost = HoneyPost.builder()
.title("this is title")
.author("juliekim")
.content("this is content")
.build();
//when
when(honeyService.findOne(anyLong())).thenReturn(honeyPost);
//then
mockMvc.perform(get("/api/honey/{id}",1L))
.andExpect(status().isOk())
.andExpect(jsonPath("$.title").value(honeyPost.getTitle()))
.andExpect(jsonPath("$.author").value(honeyPost.getAuthor()))
.andExpect(jsonPath("$.content").value(honeyPost.getContent()))
.andDo(MockMvcResultHandlers.print());
}
(1) ์ ์ฅ ๋ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํ ๊ฐ์ฒด ์์ฑ
(2) when : Service์ findOne ๋ฉ์๋๊ฐ ์คํ๋์ ๋ -> then : (1)์์ ์ ์ฅํ ๊ฐ์ฒด ๋ฐํ
(3). GET์ผ๋ก ๊ฐ์ ธ์์ ๋, ์์ํ ๊ฐ์ด ๋์ค๋์ง ๊ฒ์ฆ.
๐ GET Method Test - ๋ค์ค ์กฐํ
@Test
@DisplayName("๊ธ ๋ชฉ๋ก ์กฐํ ํ
์คํธ")
public void findPost() throws Exception {
//given
HoneyPostListResponseDto honeyPost = HoneyPostListResponseDto.builder()
.title("this is title")
.author("juliekim")
.content("this is content")
.build();
HoneyPostListResponseDto honeyPost2 = HoneyPostListResponseDto.builder()
.title("this is title2")
.author("juliekim2")
.content("this is content2")
.build();
List<HoneyPostListResponseDto> PostLists = new ArrayList<>();
PostLists.add(honeyPost);
PostLists.add(honeyPost2);
//when
when(honeyService.findAll()).thenReturn(PostLists);
//then
mockMvc.perform(get("/api/honey"))
.andExpect(status().isOk())
.andDo(MockMvcResultHandlers.print())
.andExpect(jsonPath("$.[0].title").value(honeyPost.getTitle()))
.andExpect(jsonPath("$.[0].author").value(honeyPost.getAuthor()))
.andExpect(jsonPath("$.[0].content").value(honeyPost.getContent()))
.andExpect(jsonPath("$.[1].title").value(honeyPost2.getTitle()))
.andExpect(jsonPath("$.[1].author").value(honeyPost2.getAuthor()))
.andExpect(jsonPath("$.[1].content").value(honeyPost2.getContent()))
.andDo(MockMvcResultHandlers.print());
}
(1) ์กฐํ์ ์กฐํ์ฉ DTO๋ฅผ ์์ฑํด์ฃผ์๊ธฐ ๋๋ฌธ์, ์กฐํ์ฉ DTO๋ก ๊ฐ์ฒด๋ฅผ ์์ฑ
(2) ์์๋ก ์์ฑํ ๋๊ฐ์ DTO๋ฅผ List๋ก ์์ฑ
(3) service์ finAll ๋ฉ์๋๋ฅผ ์์ฑํ ์, ๋ฏธ๋ฆฌ ์์ฑํด ๋ List๊ฐ ๋์์ผํ๋ค๊ณ ๊ฐ์ ํ๋ค.
(4) Get์ผ๋ก ๋ฐ์์จ ๊ฐ์ฒด์ ์ผ์นํ๋์ง ๊ฒ์ฆ
๋๊ฐ๋ฅผ ์ ๊ฐ์ ธ์๋ค โ
๐ PUT Method Test - ๊ธ ์์ ํ ์คํธ
@Test
@DisplayName("๊ธ ์์ ํ
์คํธ")
public void test() throws Exception {
//given
String updateTitle = "updateTitle";
String updateContent = "updateContent";
HoneyPostUpdateDto requestDto = HoneyPostUpdateDto.builder()
.title(updateTitle)
.content(updateContent)
.build();
//when
//then
mockMvc.perform(put("/api/honey/{id}", 1L)
.contentType(MediaType.APPLICATION_JSON)
.content(new ObjectMapper().writeValueAsString(requestDto)))
.andExpect(status().isOk())
.andDo(MockMvcResultHandlers.print());
}
get,put,delete,post
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
'Spring Boot' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Test Code] ๋จ์ ํ ์คํธ -Service layer & BDDMockito (0) | 2021.07.20 |
---|---|
[refactor] ๊ฒ์๊ธ๊ณผ ๋๊ธ ์ฐ๊ด๊ด๊ณ ๋งคํ ๊ฐ์ ํ๊ธฐ (0) | 2021.07.16 |
[์ฑ๋ฅ ์ต์ ํ] ์ง์ฐ๋ก๋ฉ๊ณผ ์กฐํ ์ฑ๋ฅ : XToOne (0) | 2021.07.13 |
@Valid ์ฌ์ฉํ์ฌ @RequestBody ๊ฐ์ฒด ๊ฒ์ฆํ๊ธฐ (0) | 2021.07.13 |
[์คํ๋ง with AWS] git clone ํ ๋ฐฐํฌ ์คํฌ๋ฆฝํธ ๋ง๋ค๊ธฐ (0) | 2021.07.13 |