我正在使用Unitils和Spring进行单元测试。我已经使用属性文件为Spring配置了数据源。
我的问题是,如何为Unitils使用相同的数据源或相同的属性?
Unitils期望类路径unitils.properties中有一个文件,其中包含url、用户、密码和驱动程序等数据库配置参数。
我尝试使用Spring配置中使用的属性来配置Unitils,如下所示,但它不起作用。
database.driverClassName=${jdbc.driver.class}谢谢,阿迪
发布于 2012-02-23 02:46:00
Ryan的回答是正确的,也是有帮助的,尽管我使用了不同的方法。
我扩展了类PropertiesDataSourceFactory以覆盖这些方法,如下所示:
public class UnitilsDataSourceFactory extends PropertiesDataSourceFactory {
@Override
public void init(Properties configuration) {
try {
String[] configFiles = new String[] { "applicationContext-test.xml" };
BeanFactory factory = new ClassPathXmlApplicationContext(configFiles);
SystemPropertiesReader systemPropertiesReader = (SystemPropertiesReader) factory.getBean("systemPropertiesReader");
Properties loadProperties = systemPropertiesReader.loadProperties();
super.init(loadProperties);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public DataSource createDataSource() {
DataSource dataSource = super.createDataSource();
return dataSource;
}
}还写了一个SystemPropertiesReader:
public class SystemPropertiesReader {
private Collection<Resource> resources;
public void setResources(final Collection<Resource> resources) {
this.resources = resources;
}
public void setResource(final Resource resource) {
resources = Collections.singleton(resource);
}
@PostConstruct
public Properties loadProperties() throws Exception {
final Properties systemProperties = System.getProperties();
for (final Resource resource : resources) {
final InputStream inputStream = resource.getInputStream();
try {
systemProperties.load(inputStream);
} finally {
//
}
}
return systemProperties;
}
}并添加了一个带有属性文件的bean:
<bean id="systemPropertiesReader" class="uk.co.friendslife.eventmanager.domain.dao.SystemPropertiesReader">
<property name="resource">
<value>classpath:/META-INF/em/config/eventmanager_${database_name_lower}.properties</value>
</property>
</bean>将以下内容添加到unitils.properties:
org.unitils.database.config.DataSourceFactory.implClassName=x.y.UnitilsDataSourceFactory发布于 2012-02-22 03:19:53
一个潜在的解决方案..。您可以让Spring配置从unitils.properties读取其数据源参数,而不是相反。可能不是很理想。
我相信unitils在幕后使用了spring,因此您也可以尝试使用@SpringApplicationContext在您的unitils测试中添加您的数据源上下文。如果您可以在启动时找出由unitils设置的数据源bean的名称,则可以在您的上下文中覆盖它(假设unitils数据源bean是在其他spring bean之前创建的,这可能是真的,也可能不是真的)。
例如:
@SpringApplicationContext({"correctDataSourceContext.xml"})
编辑:另一个肯定有效的选项:https://stackoverflow.com/a/6561782/411229基本上自己实例化Unitils并手动设置属性。
https://stackoverflow.com/questions/9383096
复制相似问题