Я пытаюсь настроить тестирование с помощью базы данных 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
.
Неужели я об этом совершенно не так?
Ну, мой 'sessionFactory' не получает Autowired на всех - это нуль. – AVP
Вы можете попытаться установить JNDI-имя для источника данных H2, а затем поместить контрольную точку в тестовый класс и попытаться получить этот источник данных из контекста, чтобы узнать, было ли оно создано. Просто мысль ... – lauksas