2014-01-07 5 views
1

Я пытаюсь настроить тестирование с помощью базы данных H2 в памяти для моего приложения Spring MVC.Конфигурация спящего режима с 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 не является Autowired и userDao никогда не получает его.

Мои UserDao звонки PersistenceConfig.sessionFactory() в своем конструкторе и PersistenceConfig поставляет его с sessionFactory что соответствует MySQL. Мне нужно как-то переключить это на H2 sessionFactory.

Неужели я об этом совершенно не так?

ответ

0

Похоже, что когда вы вводите вас sessionFactory, он загружается PersistenceConfig.java, как правило, при введении одного объекта также вводятся другие зависимости. Если бы я тебя, я хотел бы использовать hibertane.hbm.xml настроить протестировать соединение, он перекрывает все другие конфигурации ...

+0

Ну, мой 'sessionFactory' не получает Autowired на всех - это нуль. – AVP

+0

Вы можете попытаться установить JNDI-имя для источника данных H2, а затем поместить контрольную точку в тестовый класс и попытаться получить этот источник данных из контекста, чтобы узнать, было ли оно создано. Просто мысль ... – lauksas

0

Вы создаете UserDao объект самостоятельно

private UserDao userDao = new UserDao(); 

Spring может только вводить объект, чей жизненный цикл его управляет.

Получите бонус UserDao из вашего контекста (@Autowired), если он у вас есть (или добавьте его, если вы этого не сделаете).

+0

Но я не пытаюсь Autowire 'UserDao'. Я пытаюсь Autowire 'sessionFactory'. – AVP

+0

@AVP Является '' UserTest' sessionFactory' nulll или 'UserDao'? Spring не может вставлять бобы в объекты, которые он не контролирует. –

0

Для тестирования вы можете использовать PersistenceConfig. Вместо создания совершенно новый контекст, я бы разделить различные бобы в @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 
    } 

} 
Смежные вопросы