从测试运行时如何在Spring-Data中启用异常转换?

时间:2013-08-02 10:21:20

标签: spring-data spring-data-jpa spring-test

我正在使用Spring-Data,并希望将PersistenceExceptions转换为Springs DataAccessExceptions

我用@EnableJpaRepositories激活了Spring-Data,我可以看到Spring在启动时加载了org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0PersistenceExceptionTranslator也可用。

据我所知,documentation命名空间声明<jpa:repositories>激活了使用@Repository注释的Bean的持久性异常转换。这是Java配置(@EnableJpaRepositories)的情况吗?

这是否意味着,我必须使用@Repository注释我的Spring-Data存储库接口,或者使用如上所述配置的Spring Data是否可选?

这是界面:

@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

我无法弄清楚如何启用异常转换。有什么想法吗?

修改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();
    }
}

1 个答案:

答案 0 :(得分:0)

我使用Spring 4.1.5.RELEASE和Spring Data JPA 1.7.2.RELEASE发现持久性异常转换是默认的。

Per PersistenceExceptionTranslationPostProcessor javadoc:

  

所有Spring的适用资源工厂(例如   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() { ... }