使用Spring MVC进行Hibernate配置测试

时间:2014-01-07 23:23:04

标签: java mysql spring hibernate spring-mvc

我正在尝试使用H2内存数据库为我的Spring MVC应用程序设置测试。

现在,我对Hibernate的所有配置都在一个Java文件PersistenceConfig.java中,它保存了SessionFactory所有Hibernate配置。

但是,我的测试上下文是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>

我的测试人员课程看起来像

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"/test-context.xml",
    "classpath:/spring/spring-security.xml"})
@Transactional
public class UserTest {
  private UserDao userDao = new UserDao();

  private static User user;

  @Autowired
  @Qualifier("sessionFactory")
  private static SessionFactory sessionFactory;

  @BeforeClass
  public static void initUser() {
    user = new User(...);
  }

  @Test
  public void testSave() throws Exception {
    userDao.save(user);
    User foundUser = userDao.findByUuid(user.getUuid());
    assertEquals(foundUser.getUuid(), user.getUuid());
  }
}

sessionFactory未进行自动装配,userDao永远不会获得它。

我的UserDao在其构造函数中调用了PersistenceConfig.sessionFactory()PersistenceConfig为其提供了与MySQL对应的sessionFactory。我需要以某种方式将其切换为H2 sessionFactory

我是否完全错了?

3 个答案:

答案 0 :(得分:0)

当您注射sessionFactory时,它正在加载PersistenceConfig.java,通常当您注入一个对象时,其他依赖项也会被注入。如果我是你,我会使用hibertane.hbm.xml配置测试连接,它会覆盖所有其他配置...

答案 1 :(得分:0)

您正在创建UserDao对象

private UserDao userDao = new UserDao();

Spring只能注入一个管理它的生命周期的对象。

从你的上下文(UserDao)中获取@Autowired bean(如果你有的话)(如果你没有,可以添加一个)。

答案 2 :(得分:0)

对于测试,您可以使用PersistenceConfig。我没有设置一个完整的新上下文,而是将不同的bean分成@Profile个配置:

 @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
    }

}