【发布时间】:2011-07-11 01:56:38
【问题描述】:
也许,我做错了什么,但对于以下情况,我找不到好的出路。
我想对在下面使用Spring Batch 执行作业的服务进行单元测试。这些作业通过预先配置的AsyncTaskExecutor 在单独的线程中执行。在我的单元测试中,我想:
- 创建几个域对象并通过 DAO 持久化它们
- 调用服务方法来启动作业
- 等到作业完成
- 使用 DAO 检索域对象并检查其状态
显然,以上所有内容都应该在一个事务中执行,但不幸的是,transactions are not propagated to new threads(我理解这背后的基本原理)。
我想到的想法:
- 在步骤 (1) 之后提交事务#1。不好,因为 DB 状态应该在单元测试后回滚。
- 在作业配置中使用
Isolation.READ_UNCOMMITTED。但这需要两种不同的测试配置和生产配置。
【问题讨论】:
-
我知道有些人不同意这一点,但是运行一个运行后回滚的测试并不是一个很好的做法。特别是如果您使用的是 ORM,因为在您执行选择或刷新会话之前,它不会发出任何插入/更新命令。
-
@Augusto:我发现回滚能力很好,因为测试不会相互冲突。否则,每个单元测试类需要一个
setUp()和一个test()。可以使用补偿事务(例如delete form mytable),但我看不出它如何符合 Spring 哲学。 -
再说一次,我不认为每个人都同意我的建议。而且你需要确保你实际上是在测试某些东西,否则就像在没有断言的情况下进行测试。
标签: java multithreading spring transactions propagation