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

Java JUnit测试启动Jetty,Jetty启动Spring,可以测试查看Spring应用程序上下文,java,spring,jetty,Java,Spring,Jetty,这是为了我的整个系统的一些高级Web/Rest测试,这些测试由Jetty/Spring提供动力 我想做的是做一个完全独立的测试 启动启动应用程序的Jetty 申请将于春季开始 测试使用Webdriver/Restasured点击应用程序并测试行为 测试检查数据库中是否有更改的数据 我要做的是让整个东西在一个JVM中运行,即启动org.eclipse.jetty.server.server。 这是因为它很简单,并且避免了具有外部依赖项的测试(如启动Jetty) 这一切都很酷,但我讨厌我必须手动

这是为了我的整个系统的一些高级Web/Rest测试,这些测试由Jetty/Spring提供动力

我想做的是做一个完全独立的测试

  • 启动启动应用程序的Jetty
  • 申请将于春季开始
  • 测试使用Webdriver/Restasured点击应用程序并测试行为
  • 测试检查数据库中是否有更改的数据
我要做的是让整个东西在一个JVM中运行,即启动org.eclipse.jetty.server.server。
这是因为它很简单,并且避免了具有外部依赖项的测试(如启动Jetty)

这一切都很酷,但我讨厌我必须手动检查数据库。。。我想使用我的DAO(或者可能是服务层)类,这样我就不会重新编写DB代码了

由于我的DAO已经由Spring在与测试用例相同的JVM中的Jetty实例中启动,因此我想获取该ApplicationContext,然后拉出我的DAO bean

我在获取ApplicationContext时有点卡住了,因为这个测试不是一个“Spring”测试


人们对如何做到这一点有什么想法吗?

我认为,如果正常启动,jetty中不可能访问spring上下文,如果您使用一些嵌入式服务器,它可能会工作

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

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

我认为,如果正常启动,jetty中的spring上下文是不可能访问的,如果您使用一些嵌入式服务器,它可能会工作

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

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

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

      或者,您可以使用SpringRemoting通过RMI或HTTP将DAOBean从Jetty服务器导出,方法是将ServiceExporter 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>
      
      
      daoServiceExporter
      org.springframework.web.context.support.HttpRequestHandlerServlet
      daoServiceExporter
      /远程处理/dao
      
      然后将其导入到测试上下文中

      <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必须保持为单态,那么这是一个更好的答案。

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

      或者,您可以使用SpringRemoting通过RMI或HTTP将DAOBean从Jetty服务器导出,方法是将ServiceExporter 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>
      
      
      daoServiceExporter
      org.springframework.web.context.support.HttpRequestHandlerServlet
      daoServiceExporter
      /远程处理/dao
      
      然后将其导入到测试上下文中

      <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必须保持为单例,那么这只是一个更好的答案。

      为什么不在测试中构建另一个上下文并使用不同的dao类实例呢?您所描述的场景听起来像是maven集成测试(failsafe插件)和jetty插件。谢谢,但我特别避免使用maven插件作为一个实验,以使测试自包含。。。目前,您可以像运行任何其他测试一样运行junit测试,而不需要maven或任何其他构建工具来管理事情。。。这是因为在许多使用Mavens集成测试模型的项目中经历了痛苦。我可能会把它转移到Gradle,这样我可以在不同类型的测试之间比maven提供的有更多的分离。为什么不在测试中构建另一个上下文并使用不同的dao类实例呢?您所描述的场景听起来像是maven集成测试(failsafe插件)和jetty插件。谢谢,但我特别避免使用maven插件作为一个实验,以使测试自包含。。。目前,您可以像运行任何其他测试一样运行junit测试,而不需要maven或任何其他构建工具来管理事情。。。这是因为在许多使用Mavens集成测试模型的项目中经历了痛苦。我可能会把它转移到Gradle,这样我可以在不同类型的测试之间有比maven提供的更多的分离。+1对于使用Spring远程处理的想法,这比我的“手写”json想法要好。很好的解决方案,类似于上面DAO的注释,通常很容易在单独的sp中启动