(주) 망나니 힘집
테스트 코드는 무수한 반복 반복 반복 을 견뎌라!! 본문
테스트 코드 배우다가 정신 나간 저입니다
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가 남았네요 @!
아주 유용합니다... !
'스펙도 쌓니' 카테고리의 다른 글
Oh ... not-null property references a null or transient value 해결 Resolve (0) | 2025.01.28 |
---|---|
H2 - Spring Boot Configuration (1) | 2025.01.28 |
RestController 와 Controller 를 이용하기 위해서는 어떻게 할까? (0) | 2025.01.27 |
[Thymeleaf] 타임리프 한 페이지로 정리해보기 (1) | 2025.01.19 |
리액트 네이티브 사주 어플 개발 (2) -하단 바 만들기 (3) | 2024.12.22 |