Java 使用SpringMVC进行Hibernate配置以进行测试
我正在尝试为我的SpringMVC应用程序设置一个H2内存数据库测试 现在,我对Hibernate的所有配置都在一个Java文件Java 使用SpringMVC进行Hibernate配置以进行测试,java,mysql,spring,hibernate,spring-mvc,Java,Mysql,Spring,Hibernate,Spring Mvc,我正在尝试为我的SpringMVC应用程序设置一个H2内存数据库测试 现在,我对Hibernate的所有配置都在一个Java文件PersistenceConfig.Java中,它保存了带有所有Hibernate配置的SessionFactory 然而,我的测试上下文是XML的,因为这样做更容易——有什么方法可以让它工作吗?现在,当我运行测试时,我得到的只是错误,因为它无法连接到MySQL,它甚至不应该尝试这样做 <?xml version="1.0" encoding="UTF-8" st
PersistenceConfig.Java
中,它保存了带有所有Hibernate配置的SessionFactory
然而,我的测试上下文是XML的,因为这样做更容易——有什么方法可以让它工作吗?现在,当我运行测试时,我得到的只是错误,因为它无法连接到MySQL,它甚至不应该尝试这样做
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/jdbc
http://www.springframework.org/schema/jdbc/spring-jdbc-4.0.xsd">
<!-- annotation support -->
<context:annotation-config/>
<!-- support for transaction -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<context:component-scan base-package="com.package.configuration" />
<context:component-scan base-package="com.package.models" />
<!-- H2 datasource -->
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.h2.Driver"/>
<property name="url" value="jdbc:h2:mem:test;MODE=MySQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=TRUE"/>
<property name="username" value="sa"/>
<property name="password" value=""/>
</bean>
<jdbc:initialize-database data-source="dataSource" ignore-failures="DROPS">
<jdbc:script location="classpath:reset_database.sql"/>
<jdbc:script location="classpath:create_testdata.sql"/>
</jdbc:initialize-database>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="persistenceConfig" class="com.package.configuration.PersistenceConfig"/>
<bean id="userDao" class="com.package.models.user.UserDao"/>
</beans>
sessionFactory
未被自动连接,userDao
从未获得它
我的UserDao
在其构造函数中调用PersistenceConfig.sessionFactory()
,并且PersistenceConfig
为其提供了一个与MySQL对应的sessionFactory
。我需要以某种方式将其切换到H2会话工厂
我这样做完全错了吗?当您注入
sessionFactory
时,它似乎正在加载PersistenceConfig.java
,通常当您注入一个对象时,其他依赖项也会被注入。如果我是您,我会使用hibertane.hbm.xml
来配置您的测试连接,它会覆盖所有其他配置…您正在自己创建UserDao
对象
private UserDao userDao = new UserDao();
Spring只能注入它所管理的生命周期的对象
如果您有一个
UserDao
bean,请从您的上下文(@Autowired
it)中获取它(如果没有,请添加一个)。为了进行测试,您可以使用PersistenceConfig。我不会设置一个完整的新上下文,而是将不同的bean拆分为配置:
@Profile("test")
@Configuration
public class TestConfig {
@Bean public DataSource dataSource() {
// return Test bean
}
}
@Profile("production")
@Configuration
public class ProductionConfig {
@Bean public DataSource dataSource() {
// return productiv bean
}
}
@ActiveProfiles("test")
public class DatasourceTest {
@Test
public void test() {
// assertions
}
}
嗯,我的
sessionFactory
根本没有自动连接-它是空的。您可以尝试将JNDI名称设置为de H2数据源,然后在测试类中放置一个断点,并尝试从上下文获取此数据源,以查看它是否已创建。只是一个想法……但我不是在尝试自动连接UserDao
。我正在尝试自动连接sessionFactory
@AVP是UserTest
的sessionFactory
null还是UserDao
?Spring无法将bean注入到它无法控制的对象中。
@Profile("test")
@Configuration
public class TestConfig {
@Bean public DataSource dataSource() {
// return Test bean
}
}
@Profile("production")
@Configuration
public class ProductionConfig {
@Bean public DataSource dataSource() {
// return productiv bean
}
}
@ActiveProfiles("test")
public class DatasourceTest {
@Test
public void test() {
// assertions
}
}