05-22 14:34
Notice
Recent Posts
Recent Comments
«   2025/05   »
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
Archives
Today
Total
관리 메뉴

(주) 망나니 힘집

테스트 코드는 무수한 반복 반복 반복 을 견뎌라!! 본문

스펙도 쌓니

테스트 코드는 무수한 반복 반복 반복 을 견뎌라!!

군포망나니 2025. 1. 27. 20:14

테스트 코드 배우다가 정신 나간 저입니다 

 

Mock 이니 (모기..) 

IsOk 

accpet 

param 

get(url) 

andExcept 

status

ResultActions 

 

으어 

으어

으어

 

하지만 이거 내가 볼 때 반의 반도 안 본 것 같은데.... 

 

쨋든 JUnit5 총정리를 기획해야겠다는 생각에 정리해보았습니다. 

 

*본 소스코드는 스프링부트3 백엔드 개발자 되기 신선영 저자의 소스의 일부입니다. 

package command.rank.Controller;


import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class QuizController {

    @GetMapping("quiz")
    public ResponseEntity<String> quiz(@RequestParam("code") int code) {

        switch (code) {
            case 1:
                return ResponseEntity.created(null).body("Created!");

            case 2:
                return ResponseEntity.badRequest().body("Bad Created!");


            default:
                return ResponseEntity.ok().body("OK!");

        }

    }

    @PostMapping("/quiz")
    public ResponseEntity<String> quiz2(@RequestBody Code code){
        switch (code.value()) {
            case 1:
                return ResponseEntity.status(403).body("Forbidden!");

            default:
                return ResponseEntity.ok().body("OK!");
        }
    }
}

//record : 데이터 전달을 목적으로 하는 객체를 더 빠르고 간편하게 만들기 위한 기능
record Code(int value) {}

 

자 이렇게 Get / Post 로 보내는 소스코드가 있습니다!! 

 

이를 테스트 해보는 코드!! 바로 나오시나요? 그렇다면 당신은 테스트천재!!!

 

과연 정답은 ? 두근두근

 

package command.rank.Controller;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.util.ResourceUtils;
import org.springframework.web.context.WebApplicationContext;

import javax.print.attribute.standard.Media;

import static org.junit.jupiter.api.Assertions.*;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;


@AutoConfigureMockMvc
@SpringBootTest
class QuizControllerTest {

    @Autowired
    protected MockMvc mockMvc;

    @Autowired
    private WebApplicationContext context;

    @Autowired
    private ObjectMapper objectMapper;

    public void mockMvcSetUp() {
        this.mockMvc = MockMvcBuilders.webAppContextSetup(context)
                .build();
    }

    //문제1 : Get 요청을 보내 응답 코드마다 예상하는 응답을 반환하는 지 검증하는 테스트를 작성하시오.

    @DisplayName("quiz(): GET/quiz?code=1 이면 응답코드는 201, Created! 리턴한다.")
    @Test
    void quiz() throws Exception {

        //given
        final String url = "/quiz";

//        Code code = new Code(13);
//        objectMapper.writeValueAsString(code); // {value:13}

        //when
        final ResultActions result = mockMvc.perform(get(url)
                .param("code", "1")
        );

        //Then

        result.andExpect(status().isCreated()).andExpect(content().string("Created!"));



    }

    @DisplayName("quiz(): GET/quiz? code=2 이면 응답 코드는 400, Bad Created! 리턴한다. ")
    @Test
    void quiz2() throws Exception {

        final String url = "/quiz";

        final ResultActions result = mockMvc.perform(get(url).param("code", "2"));

        result.andExpect(status().isBadRequest()).andExpect(content().string("Bad Created!"));

    }



    @DisplayName("quiz() : post /quiz?code =1 이면 응답 코드는 403 ")
    @Test
    public void postQuiz1() throws Exception {

        final String url = "/quiz";

        final ResultActions result = mockMvc.perform(post(url).contentType(MediaType.APPLICATION_JSON)
                .content(objectMapper.writeValueAsString(new Code(1)))
        );


        result.andExpect(status().isForbidden()).andExpect(content().string("Forbidden!"));


    }

    @DisplayName("quiz(): POST / quiz? code = 13 이면 응답코드는 200, 응답 본문은 OK ! 를 리턴한다. ")
    @Test
    public  void postQuiz13() throws Exception {

        final String url = "/quiz";

        final ResultActions result = mockMvc.perform(post(url).contentType(MediaType.APPLICATION_JSON)
                .content(objectMapper.writeValueAsString(new Code(13))));


        result.andExpect(status().isOk())
                .andExpect(content().string("OK!"));

    }



}

 

 

ㅎㅎ 

 

난 그냥 외워야겠다 ㅎㅎ 

 

 

 


자 이제 ID 가 2인 멤버를 삭제하는 테스트 메서드를 만들어봤어요 

 

실행이 잘 되는데 이를 눈으로 직접 보려면 어떻게 해야 할까요? 

 

바로 중단점을 찍고 디버깅 모드로 보는 것입니다. ㅎㅎ 

 

assertThat 구문에 브레이킹 포인트 ( 빨간딱지 ) 를 찍어줬어요 

 

 

그리고 디버깅 창에 memberRepository.findAll() 메서드를 실행하여 남아있는 변수를 확인할 수 있지요ㅕ 

 

2번 B 가 사라진 1번 A, 3번 C가 남았네요 @! 

 

아주 유용합니다... !