【发布时间】:2012-08-13 13:11:55
【问题描述】:
我有以下测试:
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 Data 存储库,因此没有逻辑:
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>
【问题讨论】:
-
可以添加bookDao代码和transactionManager的配置吗?
-
@gkamal 当然,更新了更多配置。
-
您的@PostLoad 方法无法编译...它没有返回类型。您确定在编译此更改后运行测试吗?
-
@jordan002 很好 - 谢谢。但这只是这篇文章中的一个错字。是的,测试肯定会运行。我在我的项目中的大约十几个集成测试中遇到了同样的问题。
标签: java spring hibernate unit-testing jpa