Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用SpringMVC进行Hibernate配置以进行测试_Java_Mysql_Spring_Hibernate_Spring Mvc - Fatal编程技术网

Java 使用SpringMVC进行Hibernate配置以进行测试

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

我正在尝试为我的SpringMVC应用程序设置一个H2内存数据库测试

现在,我对Hibernate的所有配置都在一个Java文件
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
    }

}