我有一个Spring Boot应用程序,并使用@SpringBootTest
进行了测试。
我正在尝试使每个测试的数据库处于相同状态。
我的测试课用@Transactional
和@Rollback
注释。
而且我正在测试的服务还带有@Transactional
的注释。
据我了解,在激活TransactionManager TRACE日志时,Spring Boot应用程序事务已提交,测试事务已按预期回滚。
问题来自以下事实:我的设置创建了2种不同的交易:一项用于测试,另一项用于应用程序。
您知道我该怎么做才能使测试中创建的交易在应用程序中相同吗?
示例代码:
https://github.com/sey/transactional
您会看到GreetingsResourceTest失败,因为我认为有2个不同的上下文不共享事务。
但是,由于在测试期间没有创建特定的应用程序上下文,因此GreetingsServiceTest可以按预期工作。
答案 0 :(得分:0)
Spring的传播级别e表示与Transactional注释一起使用的事务传播行为。是您使用@Transactional覆盖Spring如何创建事务的唯一方法:
MANDATORY
Support a current transaction, throw an exception if none exists.
NESTED
Execute within a nested transaction if a current transaction exists, behave like PROPAGATION_REQUIRED else.
NEVER
Execute non-transactionally, throw an exception if a transaction exists.
NOT_SUPPORTED
Execute non-transactionally, suspend the current transaction if one exists.
REQUIRED
Support a current transaction, create a new one if none exists.
REQUIRES_NEW
Create a new transaction, and suspend the current transaction if one exists.
SUPPORTS
Support a current transaction, execute non-transactionally if none exists.