2013-02-21 173 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 
}