๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๊ฐœ๋ฐœ/Spring

Spring ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ - JUnit5

restAPI ๊ตฌ์กฐ๋กœ request๋Š” @valid ๋กœ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ๋‹ค

๋” ์•ˆ์ •์ ์ธ ์„œ๋ฒ„ ์ œ๊ณต์„ ์œ„ํ•ด API ๊ฐœ๋ฐœ์ด ๋ชจ๋‘ ์™„๋ฃŒ๋œ ์‹œ์ ์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ ค๊ณ  ํ•œ๋‹ค

 

๊ฐœ๋ฐœ๊ธฐ๊ฐ„์ด ์งง์•„

๊ฐœ๋ฐœ์„ ํ•˜๋ฉฐ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” TDD ๋ฐฉ์‹์œผ๋กœ ๊ฐœ๋ฐœํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์—

์ด์ œ์™€์„œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ผ์ผํžˆ ์ง„ํ–‰ํ•˜๊ธฐ๋ณด๋‹ค ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด ๋” ์ ํ•ฉํ•˜๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค

 

post / body ์˜ˆ์ œ

import ...

@SpringBootTest
@AutoConfigureMockMvc
class MissionControllerTest {

    @Autowired
    MockMvc mockMvc;

    @Autowired
    private ObjectMapper objectMapper;

    @Test
    @WithUserDetails(value = "1232142์–ด์ฉŒ๊ตฌuserUID")
    @Transactional
    void createOrPatchMissionSuccess() throws Exception {

        String content = objectMapper.writeValueAsString(new MissionInfo(ZonedDateTime.now(), "test"));

        mockMvc.perform(post("/v2/mission/info")
                        .contentType(MediaType.APPLICATION_JSON)
                        .content(content))
                .andExpect(status().isOk())
                .andExpect(MockMvcResultMatchers.jsonPath("$.code").value("0000"))
                .andDo(print());
    }
}

get ์˜ˆ์ œ

@Test
@WithUserDetails(value = "๋ผ๋ผ๋ผ๋ผใ… userUID")
@Transactional
void getMissionSuccessRecordSuccess() throws Exception {

    mockMvc.perform(get("/v2/mission/success"))
            .andExpect(status().isOk())
            .andExpect(MockMvcResultMatchers.jsonPath("$.code").value("0000"))
            .andDo(print());
}

patch / param ์˜ˆ์ œ

@Test
@WithUserDetails(value = "V8Inlz8q67hhClVGD9gJeRDQ7hY2")
@Transactional
void changeMissionSuccessRecordSuccess() throws Exception {

    mockMvc.perform(patch("/v2/mission/success")
                    .param("id", "1"))
            .andExpect(status().isOk())
            .andExpect(MockMvcResultMatchers.jsonPath("$.code").value("0000"))
            .andDo(print());
}

delete ์˜ˆ์ œ 

    @Test
    @WithUserDetails(value = "ใ…‡ใ„ด๋ฏธใ…“ใ„น์•„ใ…ฃใ…userUID")
    @Transactional
    void deleteAccountSuccess() throws Exception {
        mockMvc.perform(delete("/v2/accounts"))
                .andExpect(status().isOk())
                .andExpect(MockMvcResultMatchers.jsonPath("$.code").value("0000"))
                .andDo(print());
    }

 

 

 

์ฐธ๊ณ ํ•œ ์ž๋ฃŒ

 

Spring Boot - ์Šคํ”„๋ง ๋ถ€ํŠธ ํ†ตํ•ฉํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•๊ณผ ํŒ(Spring boot Integration Test)

Spring Boot แ„แ…ฆแ„‰แ…ณแ„แ…ณ ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” Spring Boot์—์„œ ํ†ตํ•ฉํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. https://medium.com/@ssowonny/%EC%84%A4%EB%A7%88-%EC%95%84%EC%A7%81%EB%8F%84-%ED%85%8C%EC%8A..

galid1.tistory.com

 

JUnit ์‚ฌ์šฉ

 

[JUnit] ์Šคํ”„๋ง๋ถ€ํŠธ + junit5 ํ™˜๊ฒฝ์—์„œ MockMvc๋กœ ์ปจํŠธ๋กค๋Ÿฌ ํ…Œ์ŠคํŠธํ•˜๊ธฐ

Mock์ด๋ž€?  ์‚ฌ์ „์  ์˜๋ฏธ๋กœ 'ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ๋งŒ๋“  ๋ชจํ˜•'์„ ์˜๋ฏธํ•˜๊ณ , ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ์‹ค์ œ ๊ฐ์ฒด์™€ ๋น„์Šทํ•œ ๋ชจ์˜ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๋ชจํ‚น(Mocking), ๋ชจํ‚นํ•œ ๊ฐ์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์–ป์–ด๋‚ด๋Š” ๊ณผ์ •์„ ๋ชฉ์—…(Mock-

scshim.tistory.com

 

Junit ์ •๋ฆฌ - MockMvc๋ฅผ ์ด์šฉํ•œ ์ปจํŠธ๋กค๋Ÿฌ ํ…Œ์ŠคํŠธ

์ž…์‚ฌ ํ›„ ๊ฐœ๋ฐœ์„ ํ•œ์ง€ ๋ฒŒ์จ 3๋…„ ์ฐจ๊ฐ€ ๋˜์—ˆ๋‹ค. ๊ฐœ๋ฐœ์„ ์ฒ˜์Œ ์ ‘ํ•  ๋•Œ๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•ด์•ผ ํ• ์ง€ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ด€์‹ฌ์ด ๋” ์ปธ๋‹ค. ํ•˜์ง€๋งŒ ์š”์ƒˆ๋Š” ๊ฐœ๋ฐœ ํ›„ ์–ด๋–ป๊ฒŒ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜์—ฌ ๋จผ

wedul.site

 

๋‹จ์œ„ ํ…Œ์ŠคํŠธ์— Spring Securiy ์ธ์ฆ ๊ด€๋ จ ์–ด๋…ธํ…Œ์ด์…˜๋“ค ์‚ฌ์šฉํ•˜๊ธฐ

๐Ÿ” ๋“ค์–ด๊ฐ€๋ฉฐ ์•ˆ๋…•ํ•˜์„ธ์š”! ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ํ…Œ์ŠคํŠธํ•  ๋•Œ Spring Security ์ธ์ฆ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ œ๊ณต๋˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜๋“ค์„ ์†Œ๊ฐœํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด ํฌ์ŠคํŒ…์—์„œ ๋‹ค๋ฃจ๋Š” ์–ด๋…ธํ…Œ์ด์…˜ ๋ชฉ๋ก์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ

shinsunyoung.tistory.com

 

๋ฐ˜์‘ํ˜•