Controller JUnit으로 테스트하기

hanahana·2022년 11월 10일
0

Spring 학원수강

목록 보기
44/45
post-thumbnail

controller는 db까지 연결하지 않고 테스트를 진행한다

테스트를 진행할 Controller

해당 Method

@RequestMapping(value = "/memberRegister.do", method = RequestMethod.POST)
	public ModelAndView memberRegister(ModelAndView mv, @RequestParam("userId") String userId,
			@RequestParam("passwd") String passwd, @RequestParam("name") String name,
			@RequestParam("email") String email, @RequestParam("tel") String tel) {
		HashMap<String, String> hMap = new HashMap<String, String>();

		hMap.put("userId", userId);
		hMap.put("passwd", passwd);
		hMap.put("name", name);
		hMap.put("email", email);
		hMap.put("tel", tel);
		
		int result = mService.registerMember(hMap);
		String str ="";
		if(result>0) {
			str ="회원가입 성공";
		}else {
			str ="회원가입 실패";
		}
		mv.addObject("msg",str);
		mv.setViewName("common/errorPage");
		return mv;
	}
  • HashMap을 이용하여 값을 저장하여 전달하기로 했다.
  • 간편하게 메세지로 성공/실패여부를 호가인할수 있도록 하였다.
  • 해당값은 service클래스로 전송된다.

연결한 service

	@Override
	public int registerMember(HashMap<String, String> hMap) {
		// TODO Auto-generated method stub
		return 1;
	}

테스트 용 이기에 무조건 성공으로 간주하고 1을 반환한다.

테스트용 클래스

//컨트롤러및 웹 항경에서 사용되는 빈을 자동 생성 등록
@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations= {
		
	"file:src/main/webapp/WEB-INF/spring/root-context.xml",
	"file:src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml"
	})
public class MemberControllerTest {

	
	@Autowired
	private WebApplicationContext wac;
	
	
	private MockMvc mocMvc;
	
	
	@Before
	public void setup() {
		this.mocMvc= MockMvcBuilders.webAppContextSetup(this.wac).build();
	}
	
	@Test
	public void testMemberRegist() throws Exception{
		try {
			mocMvc.perform(
					post("/memberRegister.do")
					.param("userId", "adminUser")
					.param("passwd", "admin1234")
					.param("name", "관리자")
					.param("email", "admin@user.com")
					.param("tel", "1234566")
					).andDo(print()).andExpect(status().isOk());
			
		}catch (Exception e) {
			// TODO: handle exception
		}
		
	}

}
  • 먼저 클래스에 선언할 어노테이션을 기억하자

    //컨트롤러및 웹 항경에서 사용되는 빈을 자동 생성 등록
    @WebAppConfiguration
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations= {
    
       "file:src/main/webapp/WEB-INF/spring/root-context.xml",
       "file:src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml"
       })
  • 어노테이션

    • 웹에서 연결하기에 @WebAppConfiguration가 필요하다
    • @RunWith(SpringJUnit4ClassRunner.class) 테스트 용에 들어가는 어노테이션
    • ContextConfiguration 에는 root-context와 servler-context 2개의 위치가 정화기 입력되어 있어야 한다.

	@Before //테스트 수행전에 하는 작업이라고 설정하는 어노테이션
	public void setup() {
		this.mocMvc= MockMvcBuilders.webAppContextSetup(this.wac).build();
	}
  • 웹용 테스트는 MockMvc가 필요하기에 메소드를 이용하여 해당 변수에 값을 넣어준다.

MockMvc란?

  • mvc를 테스트 하기 위한 도구로 mvc의 모조품이다.
  • 컨트롤러를 테스트 하기 위한 객체이다.
  • mocMvc.perForm()이란 ()안의 값으로 mvc를 수행하겠다는 의미이다

테스트를 실행하는 메소드


	@Test
	public void testMemberRegist() throws Exception{
		try {
			mocMvc.perform(
					post("/memberRegister.do")
					.param("userId", "adminUser")
					.param("passwd", "admin1234")
					.param("name", "관리자")
					.param("email", "admin@user.com")
					.param("tel", "1234566")
					).andDo(print()).andExpect(status().isOk());
			
		}catch (Exception e) {
			// TODO: handle exception
		}
		
	}
  • test어노테이션을 이용하여 테스트 메소드를 만든다.
  • mocMvc를 활용해 원본 메소드가 post로 값을 전달받으니 똑같이 post를 써주고 ()안에 주소를 넣어준다.
  • .param으로 원본메소드의 @RequestParam 값을 전달한다.
  • andDo(print()).andExpect(status().isOk());
    • andDO()를 활용해 결과를 확인한다.
    • print()는 해당결과값을 출력할다.
    • .andExpect(status().isOk())는 해당 전달값들이 정상적으로 입출력됐는지 확인한다

실행결과

MockHttpServletRequest:
HTTP Method = POST
Request URI = /memberRegister.do
Parameters = {userId=[adminUser], passwd=[admin1234], name=[관리자], email=[admin@user.com], tel=[1234566]}
Headers = []
Body =
Session Attrs = {}

Handler:
Type = com.kh.junspring.member.controller.MemberController
Method = com.kh.junspring.member.controller.MemberController#memberRegister(ModelAndView, String, String, String, String, String)

Async:
Async started = false
Async result = null

Resolved Exception:
Type = null

ModelAndView:
View name = common/errorPage
View = null
Attribute = modelAndView
value = ModelAndView [view="common/errorPage"; model={msg=회원가입 성공}]
errors = []
Attribute = msg
value = 회원가입 성공

FlashMap:
Attributes = null

MockHttpServletResponse:
Status = 200
Error message = null
Headers = [Content-Language:"en"]
Content type = null
Body =
Forwarded URL = /WEB-INF/views/common/errorPage.jsp
Redirected URL = null
Cookies = []

profile
hello world

0개의 댓글