junit / spring属性未加载应用程序上下文

时间:2010-11-18 13:59:41

标签: java eclipse spring junit maven

在运行junit测试时,我无法从应用程序上下文加载外部属性文件中的属性。

鉴于以下内容:

TestClass

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring/app-config.xml")
public class JdbcWatsonDaoTests {

    @Autowired
    JdbMyDao jdbcMyDao;

    @Before
    public void setUp() throws Exception {
    }

    @Test
    public void testMethod() {
        doSomeStuff();
    }
}

app-config.xml

<util:properties id="aProperties" location="classpath:spring/a.properties" />
<util:properties id="bProperties" location="classpath:spring/b.properties" />

<bean id="oracleDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
    <property name="url" value="${oracle.url}"/>
    <property name="username" value="${oracle.username}"/>
    <property name="password" value="${oracle.password}"/>
</bean>

并且a.properties和b.properties文件与app-config.xml位于同一位置...

我发现在运行测试时,属性占位符(文字“$ {property}”)是发送到oracle服务器而不是属性文件中的值。

我也尝试使用PropertyPlaceholderConfigurer而不是bean配置,但它仍然找不到/包含属性。

我正在使用eclipse helios,spring 3.0.5,最新版本m2eclipse和4.4 junit。我不得不降级junit以获得不同的maven / junit bug。

在tomcat中发布时,将读取并正确使用这些属性。我只在运行junit测试时看到问题。

4 个答案:

答案 0 :(得分:6)

根据您的例外情况:

  

org.springframework.jdbc.CannotGetJdbcConnectionException:   无法获得JDBC连接;嵌套   例外是   org.apache.commons.dbcp.SQLNestedException:   不能创造   PoolableConnectionFactory(ORA-01017:   无效的用户名/密码;登录   拒绝

您的问题不是找不到属性,如果找不到属性,则异常类似于org.springframework.beans.factory.BeanDefinitionStoreException: ... Could not resolve placeholder 'oracle.username'

这是因为您需要配置PropertyPlaceholderConfigurer而不是 PropertiesFactoryBean (这就是util:properties所做的http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#xsd-config-body-schemas-util-properties

<bean id="propertyPlaceHolderConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:spring/a.properties</value>
                <value>classpath:spring/a.properties</value>
            </list>
        </property>
    </bean>

答案 1 :(得分:1)

您可以将测试配置文件spring命令jbdc.properties分隔为 src / test / resources dir以尊重maven结构文件。 要配置特殊的属性文件进行测试,您必须使用 propertyPlaceHolderConfigurer 在测试弹簧应用程序上下文中定义它们,因为 Ralph 表示。

属性文件必须位于 src / test / resources 中,并使用斜杠和文件名 /a.properties 加载它们。将文件放在与弹簧配置文件相同的目录中以加载它。

<bean id="propertyPlaceHolderConfigurer"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>/a.properties</value>
            <value>/a.properties</value>
        </list>
    </property>
</bean>

答案 2 :(得分:0)

看来你正在使用maven。知道放置文件的位置会有所帮助。按照惯例,属性文件的测试版本应该放在src / test / resources /和src / main / resources中的生产版本中。他们应该自动解决。

答案 3 :(得分:0)

我放弃了。我下载了Eclipse 3.6 for Java EE的全新副本,并通过更新站点方法遵循了泉源工具套件安装实例。

我使用新工作区将项目导入到新环境中,并且每个标记都可以正常工作。

我会把它用来吸食侏儒。