2010-05-19 37 views
13

我有一個相對較小的Java庫,實現了幾十個豆子(沒有數據庫或GUI)。我創建了一個Spring Bean配置文件,其他Java項目用它來將我的bean注入到它們的東西中。如何爲Spring Test創建TestContext?

我現在第一次嘗試使用Spring Test將這些bean中的一些注入到我的junit測試類中(而不是簡單地實例化它們)。

我這樣做部分是爲了學習Spring Test,部分是爲了強制測試使用我爲其他人提供的相同的bean配置文件。

在Spring文檔中說我需要使用Spring附帶的「TestContext」類來創建應用程序上下文。我相信這應該在我的測試類中通過@ContextConfiguration註釋引用的spring XML文件中完成。

@ContextConfiguration({"/test-applicationContext.xml"}) 

但是,沒有提示要在文件中放什麼!

當我從Eclipse內部運行測試時,出現錯誤提示「未能加載應用程序上下文」......當然。

更新:

下面是測試的applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 
    <description>Holds application context for testing of the domain module.</description> 

    <!-- Imports the uuid generator bean definitions --> 
    <import resource="resources/domain-uuid.xml"/> 
</beans> 

我的項目目錄是這樣的:

domain/ 
    src/ 
     main/ 
     java/ 
     resources/ 
     test/ 
     java/ 
     resources/ (location of test-applicationContext.xml) 

只是爲了好玩我也試圖從建mvn命令行通過「mvn clean test」,我得到了以下錯誤,這可能是我真正的問題:

package org.springframework.test.context does not exist 

package org.springframework.test.context.junit4 does not exist 

cannot find symbol 
symbol: class ContextConfiguration 
@ContextConfiguration({"/resources/test-applicationContext.xml"}) 

cannot find symbol 
symbol: class SpringJUnit4ClassRunner 
@RunWith(SpringJUnit4ClassRunner.class) 

回答

10

什麼放在應用程序上下文文件中。 TestContext框架的工作方式是它允許您在集成測試的上下文中重新使用應用程序接線。所以大部分是,沒有什麼特別的東西可以放在你的應用上下文配置文件中。如果您的控制器在您的應用程序中具有服務bean相關性,那麼它也會在您的集成測試中使用。如果你的DAO在你的應用中有一個SessionFactory,那麼你的集成測試也一樣。這樣,當你編寫集成測試時,你不必再把所有東西重新連接起來。很酷。

我說上面的大部分是,因爲至少有一個例外。通常,您的應用程序將使用JNDI來查找DataSource,但在集成測試(至少是集裝箱外集成測試)中,通常不會有可用的JNDI環境。因此,您通常應該將DataSource bean創建分離爲一個單獨的文件,併爲您的實時應用程序和非JNDI版本使用JNDI版本(例如,僅爲您的集成測試創建一個直接的BasicDataSource)。下面是前者的一個例子:

<jee:jndi-lookup id="dataSource" jndi-name="jdbc/myStoreDS" resource-ref="true"/> 

,這裏是後者的一個例子:

<bean id="dataSource" 
    class="org.apache.commons.dbcp.BasicDataSource" 
    destroy-method="close" 
    p:driverClassName="${dataSource.driverClassName}" 
    p:url="${dataSource.url}" 
    p:username="${dataSource.username}" 
    p:password="${dataSource.password}" /> 

這些會去在不同的文件。第一個可能在beans-datasource.xml中用於正常應用程序使用,第二個在beans-datasource-it.xml中用於集成測試。正常的應用程序使用和集成測試(即大多數情況下,大部分的bean配置)都應該使用通用配置文件或文件。

此外,春季3引入了一個新jdbc命名空間允許你創建嵌入式數據庫,像HSQLDB數據庫或Derby數據庫,等它看起來像這樣:

<jdbc:embedded-database id="dataSource"> 
    <jdbc:script location="classpath:hsql/schema.sql" /> 
    <jdbc:script location="classpath:hsql/test-data.sql" /> 
</jdbc:embedded-database> 

,以取代BasicDataSource配置如上所述,如果你想使用這個。

爲什麼錯誤正在發生。您看到的錯誤正在發生,因爲您的@ContextConfiguration值隱含指示應用上下文文件應位於類路徑中。 重要提示:刪除/resources一塊。那是Maven內臟;當它生成JAR或WAR時,它會將resources目錄的內容複製到您的類路徑中,而不是resources本身。這應該有所幫助。

編輯:

爲了解決這個錯誤,「沒有發現任何符號」,你將需要測試的依賴添加到您的Maven POM。這將成爲JUnit和Spring Test模塊,都與<scope>test</scope>。另外,如果你正在使用像Mockito這樣的模擬框架,你還需要在你的POM中添加這個依賴項(以及測試範圍)。嘗試一下,並請回報發生了什麼。

+0

對不起 - 我沒有使用JNDI或DAO。我只是不知道在哪裏創建textContext!你說「應用程序上下文文件」 - 這是什麼? – HDave 2010-05-19 05:20:19

+0

「應用程序上下文文件」就是您的Spring配置XML文件。擁有頂級元素的人。你可以直接把它放在WEB-INF下,或者你可以把它放在類路徑中,就像你在其他評論中說的那樣,在src/test/resource下。它可能會幫助您將您的目錄結構(相關部分)添加到原始文章中,並顯示您的test-applicationContext.xml文件包含的內容。 – 2010-05-19 05:31:08

+1

好的 - 我想我明白了。我不必在任何地方指定TestContext。春天只是「知道」不知何故(如何?)。問題是Spring找不到我的配置文件。 – HDave 2010-05-19 12:38:04

6

直接找到它在src /測試/資源,將其更改爲:

@ContextConfiguration({"classpath:/test-applicationContext.xml"}) 

當您不指定任何東西,然後在相同的封裝測試類春季搜索。