我有一个Resteasy网络服务方法,该方法将MultipartFormDataInput对象作为其参数,并从中提取很多信息。我想为此方法编写一个jUnit测试,但是我一直找不到任何方法来创建该对象并将虚拟数据放入其中,因此可以直接调用我的webservice方法。服务方法从这样的表单中提取数据...
@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);
但是它并没有这样做(这个特别的错误是我无法将Output表单转换为Input表单)。我还没有找到创建新的MultiPartFormDataInput并将数据添加到其中的方法。
有人有建议吗?
最佳答案
当尝试对接受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
}