Java JUnit测试启动Jetty,Jetty启动Spring,可以测试查看Spring应用程序上下文
这是为了我的整个系统的一些高级Web/Rest测试,这些测试由Jetty/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) 这一切都很酷,但我讨厌我必须手动
- 启动启动应用程序的Jetty
- 申请将于春季开始
- 测试使用Webdriver/Restasured点击应用程序并测试行为
- 测试检查数据库中是否有更改的数据
这是因为它很简单,并且避免了具有外部依赖项的测试(如启动Jetty) 这一切都很酷,但我讨厌我必须手动检查数据库。。。我想使用我的DAO(或者可能是服务层)类,这样我就不会重新编写DB代码了 由于我的DAO已经由Spring在与测试用例相同的JVM中的Jetty实例中启动,因此我想获取该ApplicationContext,然后拉出我的DAO bean 我在获取ApplicationContext时有点卡住了,因为这个测试不是一个“Spring”测试
人们对如何做到这一点有什么想法吗?我认为,如果正常启动,jetty中不可能访问spring上下文,如果您使用一些嵌入式服务器,它可能会工作 但我认为有更简单的解决方案:
- 为测试使用第二个(不同的)spring上下文,这可能比“正常”上下文小,因为您不需要所有的服务和控制器,或者
- 在服务器中添加一些json或webservice查询接口,这些接口只会从数据库返回请求的结果。然后,您可以通过服务器中的该接口从测试访问数据库。-我认为每个实体只需要两到三个不同的查询,所以这应该不需要太多工作(但我更喜欢另一个解决方案)
- 为测试使用第二个(不同的)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中启动