2015-06-15 3 views
0

Привет, У меня проблема с управлением сеансом 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()); 
    } 
} 
+0

Внесите «SessionFactory» в тестовый пример, перед поиском выполните 'getCurrentSession(). Flush()'. –

+0

правильно запишите параметры, установленные в их типе, и подсчитайте, если запрос должен что-то вернуть. –

+0

Я не понимаю, почему вы тестируете Hibernate? Место для тестирования, которое вы правильно написали, правильно написано в вашей базе данных, а не в тестах java junit. – ConMan

ответ

0

были подобные проблемы. Объекты не могли быть удалены из H2 в памяти во время вызова метода транзакций. Исправлено удаление текущей сессии в процессе удаления DAO.

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