2013-08-02 3 views
4

Я использую Spring-Data и хочу, чтобы PersistenceExceptions был переведен в Springs DataAccessExceptions.Как включить перевод исключений в Spring-Data при запуске теста?

Я активировал Spring-Data с помощью @EnableJpaRepositories, и я вижу, что org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0 загружен Spring во время запуска. A PersistenceExceptionTranslator также доступен.

Как я понимаю documentation Декларация пространства имен <jpa:repositories> активирует трансляцию исключительных ситуаций для Beans, аннотированную @Repository. Это также относится к конфигурации Java (@EnableJpaRepositories)?

Означает ли это, что я должен аннотировать мой интерфейс репозитория Spring-Data с помощью @Repository или он является необязательным с использованием данных Spring, как это было указано выше?

Это интерфейс:

@Repository 
public interface DemoDao extends JpaRepository<Demo, Long> {} 

И это испытание:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = {TestDaoWithEmbeddedDatabaseConfiguration.class}) 
@Transactional 
public class DemoTest { 

    @Test(expected = DataAccessException.class) 
    public void testFindByTransactionStatus() throws Exception { 
     persistDemoDataWithUniqueConstraintError(); // this calls DemoDao#save() 
    } 
} 

Это создает:

javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException 

Я не могу понять, как включить перевод исключения. Есть идеи?

Edit 1:

Это тестовая конфигурация и настройка Spring:

@Configuration 
@ComponentScan("com.demo.dao") 
@EnableJpaRepositories("com.demo.dao") 
@EnableTransactionManagement 
public class TestDaoWithEmbeddedDatabaseConfiguration { 
    // DataSource (EmbeddedDatabaseBuilder), EntityManagerFactory @Bean configuration 

    @Bean 
    public PersistenceExceptionTranslator persistenceExceptionTranslator() { 
     return new HibernateExceptionTranslator(); 
    } 
} 
+0

Это должно работать, как вы ожидаете.Вы можете добавить контент конфигурации? –

+0

@OliverGierke Я добавил конфигурацию, но оставил определения Bean для Entitymanager и встроенного источника данных DB. Если необходимо, сообщите мне. Спасибо за помощь. – timomeinen

+0

У меня такая же проблема. Вы нашли решение? – mejas

ответ

0

Я нашел перевод настойчивость исключение работать будет по умолчанию, используя Spring 4.1.5.RELEASE и Spring Data JPA 1.7.2.RELEASE.

Per PersistenceExceptionTranslationPostProcessor Javadoc:

Все применимых фабрик ресурсов Спринг (например LocalContainerEntityManagerFactoryBean) реализует интерфейс PersistenceExceptionTranslator из коробки.

Мой конфиг ...

@Configuration 
@EnableTransactionManagement 
@EnableJpaRepositories(entityManagerFactoryRef="emfb", ...) 
@ComponentScan(...) 
public class TestConfig { 
    @Bean public LocalContainerEntityManagerFactoryBean emfb() { ... } 
    ... 
} 

... и тест JUnit4 как ...

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes={TestConfig.class}) 
public class MyTest { 
    ... 
    @Test public void expectFKViolation() { ... } 
    ... 
} 

... Результаты в:

Tests in error: expectFKViolation(...): ...; nested exception is org.hibernate.PropertyValueException 

оглавлению испытательный выход для org.hibernate.PropertyValueException:

o.s.t.c.s.DirtiesContextTestExecutionListener - After test method: 
context [ ..., testException = org.springframework.dao.DataIntegrityViolationException: 
not-null ...; nested exception is org.hibernate.PropertyValueException ... ] 

Установка переведенный, тип TestException по методу испытаний делает тест позеленеть:

@Test(expected="org.springframework.dao.DataIntegrityViolationException.class") 
public void expectFKViolation() { ... } 

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

  • Нет связанных вопросов^_^