Тест JUnit запускает Jetty, Jetty запускает Spring, может тестировать, видеть контекст приложения Spring - PullRequest
2 голосов
/ 23 марта 2012

Это для некоторых высокоуровневых тестов Web / Rest всей моей системы, работающих на Jetty / Spring.

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

  • Запускает Jetty, которая запускает приложение
  • Приложение запускается Spring
  • Тест использует Webdriver / RestAssured для запуска приложения и тестирования поведения
  • Тест проверяет БД на предмет измененийdata

Я пытаюсь сделать так, чтобы все это работало в одной JVM, т.е. я запускаю org.eclipse.jetty.server.Server.
Это потому, что еголегко и позволяет избежать теста, имеющего внешние зависимости (например, запуск Jetty)

Это все круто, но я ненавижу, что мне приходится проверять БД вручную ... Я хочу использовать свой DAO (или, возможно, уровень обслуживания)), поэтому я не переписываю код БД.

Так как мои DAO уже были запущены Spring в экземпляре Jetty в той же JVM , что и в тестовом примере, я хочузахватить этот ApplicationContextа затем вытащить мои DAO-компоненты.

Я немного застрял, когда получаю ApplicationContext, поскольку тест не является "весенним" тестом, скажем так.

У людей есть идеи о том, каксделать это?

Ответы [ 2 ]

2 голосов
/ 23 марта 2012

@ Ответ Ральфа самый лучший - используйте отдельный весенний контекст для тестов. В идеале вы должны реорганизовать все компоненты DAO и их зависимости в отдельный dao-beans.xml, который вы можете включить в основной контекст приложения и в свой тестовый контекст.

В качестве альтернативы вы можете использовать Spring Remoting для экспорта bean-компонентов DAO с сервера Jetty через RMI или HTTP, добавив bean-компонент ServiceExporter в ваш (реальный) контекст приложения

<bean name="daoExporter"
        class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
    <property name="service">
        <ref bean="dao" />
    </property>
    <property name="serviceInterface" value="com.example.IDao" />
</bean>

и пользовательский сервлет удаленного взаимодействия в web.xml

<servlet>
    <servlet-name>daoServiceExporter</servlet-name>
    <servlet-class>org.springframework.web.context.support.HttpRequestHandlerServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>daoServiceExporter</servlet-name>
    <url-pattern>/remoting/dao</url-pattern>
</servlet-mapping>

затем импортируем его в ваш тестовый контекст

<bean id="dao" class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
    <property name="serviceInterface" value="com.example.IDao" />
    <property name="serviceUrl" value="http://localhost:8080/remoting/dao"/>
</bean>

Это лучший ответ, например, если загрузка контекста Spring занимает много времени, или, возможно, у вас есть некоторые компоненты, которые должны оставаться одиночными.

2 голосов
/ 23 марта 2012

Я думаю, что невозможно получить доступ к контексту Spring в Jetty, если он запускается нормально, возможно, он может работать, если вы используете какой-то встроенный сервер.

Но я думаю, что есть гораздо более простые решения:

  • используйте второй (другой) контекст пружины для тестов, он может быть меньше, чем "обычный", потому что вам не понадобятся все службы и контроллеры, или
  • добавьте некоторыеИнтерфейс запросов json или webservice на вашем сервере, который просто возвращает запрошенный результат из базы данных.Затем вы можете получить доступ к базе данных из ваших тестов через этот интерфейс на сервере.- Я думаю, что вам нужно всего два или три разных запроса для каждой сущности, так что работы должно быть не так много (но я бы предпочел другое решение).
...