2010-05-19 82 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"}) 

当您不指定任何东西,然后在相同的封装测试类春季搜索。

相关问题