这是我的整个系统的一些高级Web / Rest测试,由Jetty / Spring提供支持。
我要做的是完成一个完全独立的测试,
我要做的是让整个事情在一个JVM中运行,即我正在启动一个org.eclipse.jetty.server.Server。 这是因为它很容易,并且避免了测试具有外部依赖性(如启动Jetty)
这很酷,但我讨厌我必须手动检查数据库...我想使用我的DAO(或者服务层)类,所以我不会重写数据库代码。
由于我的DAO已经由Spring在Jetty实例中以相同的JVM 作为测试用例启动,我想抓住ApplicationContext然后拉出我的DAO bean。
我有点卡住了ApplicationContext,因为测试不是每个人说的“Spring”测试。
人们对如何做到这一点有任何想法?
答案 0 :(得分:2)
我认为如果它正常启动,则无法访问jetty中的spring上下文,如果使用某个嵌入式服务器,它可能会起作用。
但我认为有更简单的解决方案:
答案 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。