Привет, У меня проблема с управлением сеансом Spring Hibernate в некоторых тестах JUnit.Spring 4 + HIbernate 4 + Junit @Transactional nativeSQL query
У меня есть тестовый класс, подписанный как @Transactional, чтобы иметь функцию автозагрузки для каждого метода тестирования; во время теста я вставляю три строки в базу данных и затем запускаю собственный запрос (используя session.createSQLQuery()), который должен возвращать список, содержащий все три элемента, которые я только что сохранил, но результат собственного запроса всегда пуст.
Я попытался удалить @Transactional из тестового класса, чтобы процесс вставки завершился фиксацией. В этом случае мой собственный запрос работает отлично, а тест зеленый, но откат не выполняется (из-за отсутствия @ транзакционный).
Лично я предпочел бы не подписывать тест с помощью @Rollback (false) и удалять данные вручную, поэтому мне было интересно, было ли это странное поведение вызвано неправильной настройкой.
Заранее спасибо.
Ниже моей настройки сеанса Spring и конфигурации диспетчера транзакций, инкриминированного теста и собственного запроса.
Spring Config:
@Bean(name = "sessionFactory")
@Autowired
public SessionFactory getSessionFactory(final DataSource dataSource) throws Exception {
final LocalSessionFactoryBuilder springSessionFactoryBean = new LocalSessionFactoryBuilder(dataSource);
springSessionFactoryBean.addAnnotatedClasses(CvSentEvent.class);
final Properties hibernateProperties = new Properties();
hibernateProperties.put("hibernate.connection.driver_class", "org.postgresql.Driver");
hibernateProperties.put("hibernate.cache.use_second_level_cache", true);
hibernateProperties.put("hibernate.hbm2ddl.auto", "validate");
hibernateProperties.put("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
hibernateProperties.put("hibernate.format_sql", false);
hibernateProperties.put("hibernate.jdbc.use_scrollable_resultsets", true);
hibernateProperties.put("hibernate.cache.region.factory_class", "org.hibernate.cache.ehcache.EhCacheRegionFactory");
hibernateProperties.put("org.hibernate.cache.ehcache.configurationResourceName", "ehcache.xml");
springSessionFactoryBean.addProperties(hibernateProperties);
return springSessionFactoryBean.buildSessionFactory();
}
Метод испытания под
@Override
@Transactional(readOnly = true)
public List<CvSentReport> searchByWebsiteAccount(final String website, final String account, final String cvs, final String budgetFIlter) {
final String sql = ""
+ "select sent, website, account from (select "
+ " sum(c.count) as sent, "
+ " c.website, "
+ " c.sponsoraccountname as account "
+ " from "
+ " cvsentevents c "
+ " where "
+ " c.website like :website "
+ " and (c.sponsoraccountname like :account or (c.sponsoraccountname IS NULL and :account = '%%')) "
+ " group by "
+ " c.website, "
+ " c.sponsoraccountname) z " + filterForCVs(cvs) + ";";
final List<Object> list = new ArrayList<Object>();
@SuppressWarnings("unchecked")
final List<Object> itemList = getSession()
.createSQLQuery(sql)
.setParameter("website", "%" + website + "%")
.setParameter("account", "%" + account + "%")
.list();
list.addAll(itemList);
return createAListOfCvSentReports(budgetFIlter, list);
}
Код испытания:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { SpringJunitContext.class })
@Transactional
public class CvSentEventDaoTest {
@Autowired
private CvSentEventDao sut;
@Test
public void findAllTheItems() {
newCvSentEvent(0, "website1", "account1", "1");
newCvSentEvent(1, "website2", "account2", "1");
newCvSentEvent(1, "website3", "account3", "0");
final List<CvSentReport> actual = sut.searchByWebsiteAccount("website", "account", "all", "all");
assertEquals(3, actual.size());
}
}
Внесите «SessionFactory» в тестовый пример, перед поиском выполните 'getCurrentSession(). Flush()'. –
правильно запишите параметры, установленные в их типе, и подсчитайте, если запрос должен что-то вернуть. –
Я не понимаю, почему вы тестируете Hibernate? Место для тестирования, которое вы правильно написали, правильно написано в вашей базе данных, а не в тестах java junit. – ConMan