Как я должен модульный тест WebServiceTemplate (SpringWS) - PullRequest
3 голосов
/ 31 января 2011

Я пытаюсь найти лучший способ написания модульных тестов для классов Spring WebService Template. Я пытаюсь проверить, правильно ли я подключил эти классы для каждого типа запроса / ответа, который генерирует мой клиент. Я также хочу убедиться, что если исключение возвращается, оно обрабатывается правильно.

Полагаю, что я пытаюсь сделать, это найти способ сделать фактические вызовы отправки / получения.

Есть предложения?

Ответы [ 4 ]

5 голосов
/ 31 января 2011

Я собираюсь быть липким и ответить на свой вопрос.

После нескольких дальнейших исследований я обнаружил, что Spring WS 2.0 имеет новую платформу тестирования клиентов, которая делает именно то, что я надеялся сделать (с http://blog.springsource.com/2011/01/11/spring-web-services-2-0-released/):

Базовым классом для тестирования интеграции на стороне клиента является MockWebServiceServer. Основной Идея в том, что шаблон веб-службы подключается к этому фиктивному серверу, отправляет его сообщение с запросом, который макет сервера затем сверяется с зарегистрированным ожидания. Если ожидания встретил, фиктивный сервер готовит ответное сообщение, которое отправляется обратно к шаблону.

Типичный сценарий тестирования код на стороне клиента состоит из:

  1. Создание MockWebServiceServer.
  2. Настройка ожидания (й) в отношении сообщения запроса.
  3. Создание соответствующего ответного сообщения
  4. Использование WebServiceTemplate как обычно, либо напрямую, либо через код клиента.
  5. Вызвать MockWebServiceServer.verify (), чтобы сделать уверен, что все ожидания были мет.

Теперь, к сожалению, мой проект все еще использует spring-ws 1.5.9. Я собираюсь попробовать обновить только клиент до 2.0 и посмотреть, не сломается ли что-нибудь. Если все пойдет хорошо, я мог бы попробовать переключиться на стороне сервера в ближайшее время.

5 голосов
/ 31 января 2011

Строго говоря, модульные тесты вообще не должны использовать WebServiceTemplate.Ваш код должен взаимодействовать с интерфейсом WebServiceOperations и должен подвергаться модульному тестированию с использованием, например, фиктивных объектов.Это не делает сетевых вызовов, а только проверяет Java, который вы пишете.

То, что вы описываете, лучше называть интеграционным тестом, где вы проверяете, что ваше подключение выполнено правильно, возможно, включая вызов кнастоящий веб-сервис.

В этом случае интеграционный тест дополняет модульный тест.Мой совет - пиши оба.

2 голосов
/ 31 января 2011

То, что вы описываете, больше не является «модульным тестом», так как вы тестируете больше, чем просто один модуль вашего класса, который использует WebServiceTemplate изолированно.Хороший модульный тест этого класса, вероятно, будет включать в себя насмешку над классом WebServiceTemplate, чтобы вы могли проверить, как ваш класс ведет себя, когда WST возвращает разные типы ответов, исключений и т. Д.

Для теста, который проверяет, как ваш классведет себя во время выполнения с подключенными соавторами (и контекстом Spring), вы должны проверить TestContext Framework Spring .Это позволяет вам аннотировать ваши тестовые классы такими вещами, как @ContextConfiguration({"path/to/spring/xml"}), чтобы Spring создавал экземпляр ApplicationContext до запуска вашего теста, и вставлял любые свойства @Autowired в ваш тестовый класс.

Последнее замечание: тестирование вашегоИспользование веб-сервисов классов против живого веб-сервиса, как правило, является плохой практикой, так как это вводит внешние зависимости от ваших тестов - работает ли сервис?На каком сервере он находится?В какой версии?и т. д. Возможно, вы не захотите запускать эти тесты как часть вашего обычного набора модульных тестов.

0 голосов
/ 31 января 2011

soapUI - хороший вариант для тестирования вашего незащищенного WS.Вы можете вручную обработать запросы на специальное тестирование или автоматизировать предварительно определенные тесты различными способами.

...