2012-08-17 165 views
3

我有以下测试:@Transactional在单元测试防止@PostLoad从被调用

public class Book 
{ 
    public boolean postLoadInvoked; 
    @PostLoad 
    private void onPostLoad() 
    { 
     postLoadInvoked = true; 
    } 
} 

public class MyIntegrationTest extends AbstractIntegrationTest 
{ 
    @Autowired 
    private BookDAO bookDAO; 

    @Test 
    public void loadBooks() 
    { 
      Book book = bookDAO.findOne(...); 
      assertTrue(book.postLoadInvoked); 
    } 
} 

此测试通过按原样,但如果我的@Transactional注释添加到测试类,它失败:

@Transactional 
@TransactionConfiguration(defaultRollback=true) 
public class MyIntegrationTest extends AbstractIntegrationTest 

为什么使用@Transactional配置测试会影响JPA回调方法?

编辑

的DAO只是一个Spring数据存储库,所以没有逻辑:

public interface BookDAO extends 
    JpaRepository<Book, Long>, 
    QueryDslPredicateExecutor<Book> {} 

事务管理器也有一个标准配置:

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory" /> 
    <property name="dataSource" ref="dataSource" /> 
</bean> 

<bean id="entityManagerFactory" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="packagesToScan"> 
     <list> 
      <value>com.mangofactory.example</value> 
     </list> 
    </property> 
    <property name="persistenceUnitName" value="spring-test" /> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="showSql" value="true" /> 
      <property name="generateDdl" value="true" /> 
      <property name="databasePlatform" value="org.hibernate.dialect.H2Dialect" /> 
     </bean> 
    </property> 
</bean> 

<bean id="dataSource" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="org.h2.Driver" /> 
    <property name="url" value="jdbc:h2:mem:test;DB_CLOSE_DELAY=-1" /> 
</bean> 
+0

您可以添加bookDao代码和transactionManager的配置吗? – gkamal 2012-08-17 05:02:03

+0

@gkamal当然,更新了更多的配置。 – 2012-08-17 05:49:54

+0

您的@PostLoad方法不会编译...它没有返回类型。您确定在编译此更改后运行测试吗? – 2012-08-30 19:55:56

回答

1

我不确定您正在使用的是Spring版本还是AbstractIntegration测试扩展了一些东西,但要检查的一件事是,在你的层次结构中,测试应该扩展一些抽象的事务上下文感知的春季测试类。

,我正想着这些类:

org.springframework.test.AbstractTransactionalSpringContextTests 
org.springframework.test.AbstractTransactionalDataSourceSpringContextTests 

或一些JUnit的味道(取决于版本,您正在使用):

org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests 
org.springframework.test.context.junit38.AbstractTransactionalJUnit38SpringContextTests 
0

我能想到的原因有两个:

  1. @PostLoad仅在事务提交后执行。不太可能。

  2. 您是如何启用交易的?您是否指定proxyTargetClass = true?否则,你可能会感到奇怪的行为。

相关问题