2013-02-21 174 views
3

我有一個Resteasy webservice方法,它將一個MultipartFormDataInput對象作爲它的參數,並從中抽取大量信息。我想爲這個方法編寫一個jUnit測試,但是我一直無法找到任何方法來創建這個對象,並將虛擬數據放在裏面,所以我可以直接調用我的webservice方法。該服務方法從這樣的形式提取數據...爲Java jUnit測試創建一個MultipartFormDataInput對象

@POST 
@Path("/requestDeviceCode") 
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) 
@Consumes("multipart/form-data") 
public DeviceCodeModel requestDeviceCode(final MultipartFormDataInput inputMultipart) { 

    // process the form data - only field in the form is the token 
    Map<String, List<InputPart>> formData = null; // we'll put the form data in here 
    formData = inputMultipart.getFormDataMap(); 

    String token = null; 
    try { 
     token = formData.get("Token").get(0).getBodyAsString(); 
     this._logger.debug("Pulled encrypted token out of input form, it's " + token); 

和工作正常,但試圖創建一個對象來傳遞的PARM爲「requestDeviceCode」我已經阻礙。我試過這個變化...

 // create a multipartForm (input to the service POST) and add the "token" string to it 
     MultipartFormDataOutput newForm = new MultipartFormDataOutput(); 
     newForm.addFormData("Token", encryptedXMLString, MediaType.APPLICATION_XML_TYPE); 

     _service.requestDeviceCode((MultipartFormDataInput) newForm); 

,但它只是沒有這樣做(這個特殊的錯誤是,我不能投的輸出形式的輸入形式)。我一直無法找到一種方法來創建一個新的MultiPartFormDataInput並向其中添加數據。

有沒有人有任何建議?

+0

你試圖對代碼進行測試,以便從MultiPartFormDataInput提取數據,你的程序正確地使用它從對象得到了數據的能力,或測試? – aglassman 2013-02-21 17:08:56

+0

爲此,我正在測試我的代碼從表單中正確提取數據的能力。我有其他的測試調用了使用從表單中提取的令牌的方法,並且這些方法正在工作,但爲了完整起見,我希望有一個集成測試來測試端到端的服務,因此試圖創建並填充MultipartFormDataInput對象。 – 2013-02-21 17:18:58

+0

想知道你是否有進一步的... – drvdijk 2013-10-31 19:37:11

回答

0

如何進行集成測試?
在您的測試中啓動jetty或Tomcat並讓它運行您的REST服務。 作爲HTTP客戶端,我將採用Apache HttpComponents客戶端,請參閱Tutorialexamples page上的MultiPart客戶端示例。

+0

這是一種可能性,但我希望找到一些可以像其他測試一樣在飛行中執行的事情,而不是每次都需要服務器啓動的事情。 – 2013-02-22 14:39:38

+0

通過使用maven [failsafe插件](http://maven.apache.org/surefire/maven-failsafe-plugin/integration-test-mojo.html),您仍然可以自動執行此操作並將其集成到持續集成中在集成測試階段自動啓動和關閉Jetty,請參閱Maven中的插件自動執行[Jetty插件文檔](http://docs.codehaus.org/display/JETTY/Maven+Jetty+Plugin) 。 – 2013-02-22 14:51:43

2

當試圖單元測試接受MultipartFormDataInput的RestEasy WebService的方法時,我偶然發現了一個類似的問題。

你可以做什麼,是嘲笑MultipartFormDataInput與嘲笑InputPart返回準備好的地圖你希望接受各種形式的參數。

可能的解決方法(使用JUnit /的Mockito):

@Test 
public void testService() { 
    // given 
    MultipartFormDataInput newForm = mock(MultipartFormDataInput.class); 
    InputPart token = mock(InputPart.class); 

    Map<String, List<InputPart>> paramsMap = new HashMap<>(); 
    paramsMap.put("Token", Arrays.asList(token));   

    when(newForm.getFormDataMap()).thenReturn(paramsMap); 
    when(token.getBodyAsString()).thenReturn("expected token param body"); 
    // when 
    DeviceCodeModel actual = _service.requestDeviceCode(newForm); 
    // then 
    // verifications and assertions go here 
}