![](/img/trans.png)
[英]@BeforeAll JUnit/spring-boot-test alternative that runs when application context starts
[英]JUnit test starts Jetty, Jetty starts Spring, can test see spring application context
這是對由Jetty / Spring驅動的整個系統的一些高級Web / Rest測試。
我正在嘗試做的是一個完全獨立的測試,
我想做的是讓整個事情在單個JVM中運行,即我正在啟動org.eclipse.jetty.server.Server。
這是因為它很容易,並且避免了測試具有外部依賴性(例如啟動Jetty)
這一切都很酷,但是我討厭必須手動檢查數據庫……我想使用我的DAO(或者也許是服務層)類,所以我不會重寫數據庫代碼。
由於我的DAO已由Spring在與測試用例相同的JVM中的Jetty實例中啟動,因此我想獲取該ApplicationContext,然后取出我的DAO bean。
我有點無法獲得ApplicationContext,因為測試不是每個人所說的“春季”測試。
人們對如何執行此操作有任何想法?
我認為,如果正常啟動,則無法在碼頭上訪問spring上下文,如果您使用某些嵌入式服務器,則可能可以工作。
但是我認為有更簡單的解決方案:
@Ralph的答案是最好的-在測試中使用單獨的spring上下文。 理想情況下,您應該將所有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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.