방배동놈
95
2018-11-06 09:31:07
4
601

RESTful api 테스트 중 파라미터 관련 코드 질문드립니다!


안녕하세요 개발 중인 api를 대상으로 junit 테스트 진행 중에 있습니다. 사실 junit이라던지 테스트는 생소하여 이게 맞나 싶기도 하지만.. 우선 코드 관련해서 질문 하나 드리겠습니다!


public void testGetMethod_array(String url, String[] paramName, String[] paramValue) throws Exception {
        mockMvc.perform(get(url).param(paramName[0], paramValue[0]).param(paramName[1], paramValue[1]).param(paramName[2], paramValue[2]))
        	   .andDo(print())
        	   .andExpect(status().isOk());
    }

먼저 위와 같이 각각의 Http Request에 맞는 테스트 메서드를 작성하였습니다. (Get 테스트 예시)

그 후 아래와 같이,

 

@Test
	public void employee_list() throws Exception {
		String[] list_paramName = { "locale", "empKey", "searchWord", "startPage", "pageCount" };
		String[] list_paramValue = { locale, empKey, searchWord, startPage, pageCount };
		testGetMethod_array("/employee/list", list_paramName, list_paramValue);
	}

	@Test
	public void employee_image() throws Exception {
		String[] image_paramName = { "locale", "empKey", "height" };
		String[] image_paramValue = { locale, empKey, height };
		testGetMethod_array("/employee/image", image_paramName, image_paramValue);
	}

	@Test
	public void employee_detail() throws Exception {
		String[] detail_paramName = { "locale", "empKey", "requestEmpKey" };
		String[] detail_paramValue = { locale, empKey, requestEmpKey };
		testGetMethod_array("/employee/detail", detail_paramName, detail_paramValue);
	}

	@Test
	public void employee_web() throws Exception {
		String[] web_paramName = { "locale", "empKey", "targetEmpKey" };
		String[] web_paramValue = { locale, empKey, targetEmpKey };
		testGetMethod_array("/employee/web", web_paramName, web_paramValue);
	}

각각의 컨트롤러의 Endpoint에 대하여 위의 메서드를 불러와 테스트를 진행합니다.
문제는 여기서 Endpoint들이 원하는 파라미터의 값과 갯수가 제각각이라는 점입니다.

이 문제를 해결하기 위해서

public void testGetMethod_param(String url, String locale, String empKey, String accessToken) throws Exception {
    	MultiValueMap<String, String> paraMap =new LinkedMultiValueMap<>();
    	paraMap.add("locale", locale);
    	paraMap.add("empKey", empKey);
    	paraMap.add("accessToken", accessToken);
    	mockMvc.perform(get(url).params(paraMap))
    	.andDo(print())
 	    .andExpect(status().isOk());
    }

위와 같이 코드를 변경하였고 paraMap에 값을 넣는 과정에서 for문이나 if문 등을 사용하려 하였으나,
밑의 params 메서드를 쓰기 위해선 스프링 프레임워크 4.2.4 버전 이상 사용해야더군요. (현재 4.1.6 버전 사용 중)

해당 프레임워크 버전을 올릴 수가 없어 다른 방법을 고려해봐야하는데 어떤 좋은 방법 없을까요?

의견 부탁드립니다!ㅠㅠ




0
0
  • 답변 4

  • LichKing
    14k
    2018-11-06 10:01:57
    @Test
    public void test() throws Exception {
    testGetMethod_array("www.naver.com", builder -> builder.param("name1", "value1").param("name2", "value2"));
    }

    public void testGetMethod_array(String url, UnaryOperator<MockHttpServletRequestBuilder> operator) throws Exception {
    mvc.perform(operator.apply(get(url)))
    .andDo(print())
    .andExpect(status().isOk());
    }

    이런형태로 함수를 파라미터화하면 어느정도 원하시는게 될것같네요

    1
  • 방배동놈
    95
    2018-11-06 11:22:40 작성 2018-11-06 11:55:35 수정됨

    답변 감사드립니다. 말씀하신대로 해결하였습니다!

    0
  • LichKing
    14k
    2018-11-06 12:26:02
    중복을 제거하려고 하는 모습이 너무 보기좋습니다 ㅎㅎㅎㅎ 앞으로도 화이팅하시길 바래요
    1
  • 방배동놈
    95
    2018-11-06 12:35:32
    정말 감사드립니다! 큰 힘이 되어주시네요ㅠㅠ
    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.