# JUNIT를 사용한 VIEW의 Form 테스트하기
- Event 정보
- Form 화면 , 등록 컨트롤러
1. Event.java : 이벤트 정보
package com.example.demo.junitFormTest;
public class Event {
private String eventName;
private String eventDescription;
private Integer eventCount;
public Integer getEventCount() {
return eventCount;
}
public void setEventCount(Integer eventCount) {
this.eventCount = eventCount;
}
public String getEventName() {
return eventName;
}
public void setEventName(String eventName) {
this.eventName = eventName;
}
public String getEventDescription() {
return eventDescription;
}
public void setEventDescription(String eventDescription) {
this.eventDescription = eventDescription;
}
}
2. FormController.java : 이벤트 화면 및 이벤트 등록(이벤트 정보 확인)
package com.example.demo.junitFormTest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.*;
@Controller
@RequestMapping("junitForm")
public class FormController {
/**
* 이벤트 등록 화면 컨트롤러
* @param model
* @return
*/
@GetMapping("/formEvent")
public String formEvent(Model model) {
// formEvent 화면에 Event 그릇 내려 주기
model.addAttribute("event", new Event());
return "/junit/FormTest/formEvent";
}
/***
* 이벤트 정보 확인
* @param event
* @param bindingResult
* @return
*/
@PostMapping("/regEvent")
@ResponseBody
public Event regEvent(
@ModelAttribute Event event,
// 값을 바인딩 할 수 없는 경우네는 BindingResult 4000 에러
// 이벤트 변수 타입이 맞지 않은 경우 null 처리
BindingResult bindingResult) {
if(bindingResult.hasErrors()){
// binding 에러가 된 경우, 에러 종류 찍기
for (ObjectError allError : bindingResult.getAllErrors()) {
System.out.println(allError.toString());
}
}
return event;
}
}
3. FormControllerTest.java : 이벤트 화면 및 이벤트 등록(이벤트 정보 확인)
package com.example.demo.junitFormTest;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import javax.swing.*;
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.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
@WebMvcTest
@RunWith(SpringRunner.class)
class FormControllerTest {
@Autowired
MockMvc mockMvc;
/**
* 이벤트 화면 테스트
* @throws Exception
*/
@Test
void formEvent() throws Exception {
// 이벤트 화면 테스트하기
mockMvc.perform(get("/junitForm/formEvent"))
.andDo(print())
// 이벤트 화면 이름 확인하기
.andExpect(view().name("/junit/FormTest/formEvent"))
// 이벤트 화면의 model 정보 확인하기
.andExpect(model().attributeExists("event"))
;
}
@Test
void regEvent() throws Exception {
// 이벤트 regEvent 확인하기
mockMvc.perform(post("/junitForm/regEvent")
// 파라미터 정보
.param("eventName", "testEvent")
.param("eventDescription", "이벤트를 테스트합니다")
.param("eventCount", "12")
)
.andDo(print())
// 파라미터 정보 검증하기
.andExpect(jsonPath("eventName").value("testEvent"))
.andExpect(jsonPath("eventDescription").value("이벤트를 테스트합니다"))
.andExpect(jsonPath("eventCount").value("12"))
.andExpect(status().isOk())
;
// 이벤트 regEvent 확인하기
mockMvc.perform(post("/junitForm/regEvent")
// eventCount는 숫자가 되어야 하나 String 값이 들어가서 바인딩 에러가 발생한다.
.param("eventName", "testEvent")
.param("eventDescription", "이벤트를 테스트합니다")
.param("eventCount", "바인딩 에러 만들기")
)
;
}
}
4. 테스트 화면 결과
- eventCount에 숫자 대신 String을 넘음으로써 바인딩 에러 발생.