2012-08-17 148 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?否則,你可能會感到奇怪的行爲。

相關問題