这是针对由Jetty/Spring提供支持的整个系统的一些高级Web/Rest测试。
我想做的是进行一个完全独立的测试,
- 启动启动应用程序的Jetty
- 应用程序启动Spring
- 测试使用Webdriver/RestAssured来打击应用程序和测试行为
- 测试检查数据库中的更改数据
我想做的是让整个事情在一个JVM中运行,也就是说,我正在启动一个org.eclipse.jjetty.server.server。
这是因为它很容易,并避免了测试具有外部依赖性(如启动Jetty)
这一切都很酷,但我讨厌我必须手动检查数据库。。。我想使用我的DAO(或者服务层)类,这样我就不会重写DB代码了。
由于我的DAO已经由Spring在与测试用例相同的JVM中的Jetty实例中启动,所以我想获取ApplicationContext,然后取出我的DAObean。
我在获取ApplicationContext方面有点困难,因为该测试并不是一个"Spring"测试。
人们对如何做到这一点有什么想法吗?
我认为如果正常启动,就不可能访问jetty中的spring上下文,如果使用某种嵌入式服务器,它可能会工作。
但我认为有更简单的解决方案:
- 使用第二个(不同的)spring上下文进行测试,这个上下文可能比"正常"上下文小,因为您不需要所有的服务和控制器,或者
- 在服务器中添加一些json或webservice查询接口,它只需从数据库返回请求的结果。然后,您可以通过服务器中的接口从测试中访问数据库我认为每个实体只需要两到三个不同的查询,所以应该不需要太多工作(但我更喜欢其他解决方案)
@Ralph的答案是最好的——使用单独的spring上下文进行测试。理想情况下,您应该将所有DAO bean及其依赖项重构为一个单独的dao-beans.xml
,可以将其包含在主应用程序上下文和测试上下文中。。
或者,您可以使用Spring Remoting通过RMI或HTTP将DAO bean从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>
然后将其导入您的测试上下文
<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时,这才是更好的答案。