회사에서 테스트 코드 없이 업무를 진행하다가 갑자기 메소드 자체가 사라졌지만 알아채지 못하고 배포가 될 뻔한 상황이 있었습니다. 그 일 이후로 TDD방식이 아니여도 하나 하나 테스트 코드를 써보며 공부하기로 했고 혼자 찾아보며 작성해 본 내용 입니다.
@RestController
@RequestMapping({"/cafe"})
public class CafeInfoController{
@GetMapping("/categoryList")
public String categoryList(@RequestParam(value = "store_code",required = false,defaultValue = "") String store_code){
if (store_code.equals("")) {
return "not found store_code";
} else {
return "store_code"+store_code;
}
}
}
get방식으로 "/cafe/categoryList" URL을 호출 하면 Stroe_code의 값이 잘 넘어 오는지에 대한 컨트롤러입니다. 이후에 test 폴더에 작성한 테스트 코드를 작성하였습니다.
@RunWith(SpringRunner.class) //스프링 테스트시 필요한 어노테이션
@WebMvcTest(CafeInfoController.class) //특정 Controller만 테스트 할려는 어노테이션
public class CafeControllerTest {
// 스프링 MVC 테스트의 시작점. GET/POST에 대한 API 테스트 의존성 주입
@Autowired
private MockMvc mvc;
@Autowired
public CafeInfoController cafeInfoController;
@Before
public void createController(){
mvc = MockMvcBuilders.standaloneSetup(cafeInfoController).build();
}
@DisplayName("카테고리 리스트 조회")
@Test
public void categoryListControllerTest() throws Exception {
RequestBuilder reqbuild = MockMvcRequestBuilders.get("/order/cafeCategoryList").param("store_code","0100004");
//given
// store_code =0100004
//when
mvc.perform(reqbuild)
//then
.andExpect(status().isOk()).andDo(print()); // 결과 출력;
}
}
MockMvc는 애플리케이션 배포를 진행하지 않아도 서버의 MVC동작을 할 수 있게 해주는 라이브러리입니다. MockMvc를 설정할려면 MockMvcBuilders 사용해야하고 이것은 @Before 어노테이션을 이용해 테스트코드 실행 전에 실행이 가능하도록 설정하였습니다.
MockMvc의 perform메소드를 이용해 컨트롤러를 실행 시키고 통신 상태가 200으로 떨어지는지에 대한 내용과 그 결과를 출력 시키도록 만들었습니다.
이후 MockMvcRequestBuilders.get를 이용해 테스트할 URL과 파라미터 값을 설정해주고 테스트를 진행하였습니다.
--스토어 파라미터 값을 설정해 주었을때의 결과--
--스토어 파라미터 값이 빈값일 경우--
이렇게 다른 결과 값이 나옵니다.