关于Spring Framework Test,对于@SqlConfig annotation,它具有一些有价值的属性,例如:
dataSource
:在可能的情况下定义一个显式的 dataSource。如果应用程序定义了2DataSources
,其中一个有@Primary
,但在Test类中需要第二个。transactionManager
:同上,因此必须根据次要的 dataSource - it选择 transactionManager,以保持同一对一起工作。* 如果我错了请纠正我 *
因此,@Service
和@Repository
根据其@Transactional
设置进行测试
这篇文章的原因是关于transactionMode
属性,它通过SqlConfig.TransactionMode枚举工作,有三个值:
DEFAULT
INFERRED
ISOLATED
我读了javadoc,但不清楚何时使用 * 显式 * 其中任何一个,特别是最新的。
考虑因素
该应用程序,对于生产,将真正与当前的基础设施,根据 * 主要 * 和 * 次要 * 对DataSource
s和TransactionManager
s和@Transactional
设置。* 因此,必须测试基础设施 *。
问题
- 何时必须为
SqlConfig.TransactionMode
定义@SqlConfig
的每个值?
为什么要使用替代配置来对抗 * 注意事项 * 部分中提到的预期和真实的配置?
1条答案
按热度按时间mutmk8jj1#
理解Spring Framework中的
@SqlConfig
annotation的行为是至关重要的,特别是在测试执行期间涉及到事务管理时。具体来说,@SqlConfig
的transactionMode
属性控制在事务上下文中如何处理SQL脚本。下面是一个细分:DEFAULT
:使用此设置,事务管理默认为框架的标准行为。简单地说,如果一个活动事务正在进行,SQL脚本将在其中执行。如果没有正在进行的事务,则在没有事务上下文的情况下处理脚本。INFERRED
:当设置为INFERRED
时,Spring尝试根据脚本中的某些关键字推断脚本的事务性质,如BEGIN
,COMMIT
,CREATE
,ALTER
等。如果存在这样的关键字,Spring假设脚本管理自己的事务,因此在任何现有事务之外执行它。ISOLATED
:在这种模式下,每个SQL脚本都被授予自己独特的事务,一旦脚本执行结束,这些事务就会被提交。当您希望一个脚本中的更改对后续脚本或测试立即可见时,这是一个有用的设置。所以,来回答你的问题:
transactionMode
的选择取决于SQL脚本的行为及其与数据库的交互。如果您的脚本处理自己的事务,那么INFERRED
或ISOLATED
可能是合适的选择。否则,DEFAULT
设置就足够了。然而,重要的是要记住,理想情况下,测试配置应该尽可能接近地反映生产设置。除非有令人信服的理由在测试中使用不同的事务模式,否则应该保留相同的配置以确保一致性和可靠性。