JUnit测试启动Jetty,Jetty启动Spring,可以测试看Spring应用程序的上下文

时间:2012-03-23 03:45:40

标签: java spring jetty

这是我的整个系统的一些高级Web / Rest测试,由Jetty / Spring提供支持。

我要做的是完成一个完全独立的测试,

  • 启动启动应用程序的Jetty
  • 应用程序启动Spring
  • 测试使用Webdriver / RestAssured来命中应用程序和测试行为
  • 测试检查DB是否有更改的数据

我要做的是让整个事情在一个JVM中运行,即我正在启动一个org.eclipse.jetty.server.Server。 这是因为它很容易,并且避免了测试具有外部依赖性(如启动Jetty)

这很酷,但我讨厌我必须手动检查数据库...我想使用我的DAO(或者服务层)类,所以我不会重写数据库代码。

由于我的DAO已经由Spring在Jetty实例中以相同的JVM 作为测试用例启动,我想抓住ApplicationContext然后拉出我的DAO bean。

我有点卡住了ApplicationContext,因为测试不是每个人说的“Spring”测试。

人们对如何做到这一点有任何想法?

2 个答案:

答案 0 :(得分:2)

我认为如果它正常启动,则无法访问jetty中的spring上下文,如果使用某个嵌入式服务器,它可能会起作用。

但我认为有更简单的解决方案:

  • 使用第二个(不同的)弹簧上下文进行测试,这可能小于“普通”弹簧上下文,因为您不需要所有服务和控制器,或
  • 在您的服务器中添加一些json或webservice查询接口,它只返回数据库中请求的结果。然后,您可以通过服务器中的该接口从测试中访问数据库。 - 我认为每个实体只需要两到三个不同的查询,所以它应该不是那么多工作,(但我更喜欢其他解决方案)。

答案 1 :(得分:2)

@Ralph的答案是最好的 - 为测试使用单独的弹簧上下文。理想情况下,您应该将所有DAO bean及其依赖项重构为一个单独的dao-beans.xml,您可以将其包含在主应用程序上下文和测试上下文中。

或者,您可以使用Spring Remoting通过向您的(真实)应用程序上下文添加ServiceExporter bean,通过RMI或HTTP从Jetty服务器导出DAO bean

<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中的自定义Spring远程处理servlet

<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上下文需要很长时间,或者你可能有一些必须保留单例的bean。