2013-02-21 4 views
3

У пользователя есть метод Restsase webservice, который использует объект MultipartFormDataInput в качестве своего пакета и выводит из него много информации. Я бы хотел написать jUnit-тест для этого метода, но мне не удалось найти способ создать этот объект и поместить в него фиктивные данные, чтобы я мог напрямую вызвать свой метод webservice. Метод обслуживания извлекает данные из формы, как это ...Создание объекта MultipartFormDataInput для тестирования jUnit Java

@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); 

и что работает отлично, но при попытке создать объект для передачи в качестве Парма к «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

+0

Для этого я проверяю способность моего кода правильно извлекать данные из формы. У меня есть другие тесты, которые вызывают метод, в котором используется токен, извлеченный из формы, и те работают, но для полноты я хотел бы иметь интеграционный тест, который проверяет эту службу от конца до конца, поэтому пытается создать и заполнить объект MultipartFormDataInput. –

+0

Удивляясь, если у вас есть что-то еще с этим ... – drvdijk

ответ

0

Как насчет проведения теста интеграции?
Запустите причал или Tomcat, встроенный в ваши тесты, и пусть он запустит службу REST. В качестве HTTP-клиента я бы взял клиент Apache HttpComponents, см. Tutorial и пример клиента MultiPart на examples page.

+0

это возможность, но я надеялся найти что-то, что я мог бы выполнить на лету, как и другие тесты, а не что-то, что потребует запуска сервера каждый раз. –

+0

Вы все еще можете автоматизировать это и интегрировать это в свою непрерывную интеграцию, используя maven [отказоустойчивый плагин] (http://maven.apache.org/surefire/maven-failsafe-plugin/integration-test-mojo.html) вместе с автоматический запуск и завершение работы Jetty вокруг фазы интеграции, см. * Автоматическое выполнение плагина * в документации maven [Jetty Plugin] (http://docs.codehaus.org/display/JETTY/Maven+Jetty+Plugin) , –

2

Я наткнулся на аналогичную проблему при попытке модульного тестирования моего метода RestEasy WebService, который принимает MultipartFormDataInput.

Что вы могли бы сделать, чтобы дразнить 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 
} 
Смежные вопросы