Class TransactionalTestExecutionListener
- All Implemented Interfaces:
Ordered,TestExecutionListener
TestExecutionListener that provides support for executing tests
within test-managed transactions by honoring Spring's
@Transactional annotation.
Test-managed Transactions
Test-managed transactions are transactions that are managed
declaratively via this listener or programmatically via
TestTransaction. Such transactions should not be confused with
Spring-managed transactions (i.e., those managed directly
by Spring within the ApplicationContext loaded for tests) or
application-managed transactions (i.e., those managed
programmatically within application code that is invoked via tests).
Spring-managed and application-managed transactions will typically
participate in test-managed transactions; however, caution should be
taken if Spring-managed or application-managed transactions are
configured with any propagation type other than
REQUIRED
or SUPPORTS.
Enabling and Disabling Transactions
Annotating a test method with @Transactional causes the test
to be run within a transaction that will, by default, be automatically
rolled back after completion of the test. If a test class is
annotated with @Transactional, each test method within that class
hierarchy will be run within a transaction. Test methods that are
not annotated with @Transactional (at the class or method
level) will not be run within a transaction. Furthermore, tests that
are annotated with @Transactional but have the
propagation type set to
NOT_SUPPORTED
or NEVER
will not be run within a transaction.
Declarative Rollback and Commit Behavior
By default, test transactions will be automatically rolled back
after completion of the test; however, transactional commit and rollback
behavior can be configured declaratively via the @Commit
and @Rollback annotations at the class level and at the
method level.
Programmatic Transaction Management
As of Spring Framework 4.1, it is possible to interact with test-managed
transactions programmatically via the static methods in TestTransaction.
TestTransaction may be used within test methods,
before methods, and after methods.
Executing Code outside of a Transaction
When executing transactional tests, it is sometimes useful to be able to
execute certain set up or tear down code outside of a
transaction. TransactionalTestExecutionListener provides such
support for methods annotated with @BeforeTransaction
or @AfterTransaction. As of Spring Framework 4.3,
@BeforeTransaction and @AfterTransaction may also be declared
on Java 8 based interface default methods.
Configuring a Transaction Manager
TransactionalTestExecutionListener expects a
PlatformTransactionManager bean to be defined in the Spring
ApplicationContext for the test. In case there are multiple
instances of PlatformTransactionManager within the test's
ApplicationContext, a qualifier may be declared via
@Transactional (e.g., @Transactional("myTxMgr")
or @Transactional(transactionManager = "myTxMgr"), or
TransactionManagementConfigurer can be implemented by an
@Configuration
class. See TestContextTransactionUtils.retrieveTransactionManager(org.springframework.test.context.TestContext, java.lang.String)
for details on the algorithm used to look up a transaction manager in
the test's ApplicationContext.
@Transactional Attribute Support
| Attribute | Supported for test-managed transactions |
|---|---|
value and transactionManager | yes |
propagation |
only NOT_SUPPORTED
and NEVER are supported |
isolation | no |
timeout | no |
readOnly | no |
rollbackFor and rollbackForClassName |
no: use TestTransaction.flagForRollback() instead |
noRollbackFor and noRollbackForClassName |
no: use TestTransaction.flagForCommit() instead |
- Since:
- 2.5
- Author:
- Sam Brannen, Juergen Hoeller
- See Also:
-
Field Summary
FieldsFields inherited from interface org.springframework.core.Ordered
HIGHEST_PRECEDENCE, LOWEST_PRECEDENCE -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionvoidafterTestMethod(TestContext testContext) If a transaction is currently active for the supplied test context, this method will end the transaction and run@AfterTransactionmethods.voidbeforeTestMethod(TestContext testContext) If the test method of the supplied test context is configured to run within a transaction, this method will run@BeforeTransactionmethods and start a new transaction.final intgetOrder()Returns4000.protected PlatformTransactionManagergetTransactionManager(TestContext testContext) Get the transaction manager to use for the supplied test context.protected PlatformTransactionManagergetTransactionManager(TestContext testContext, String qualifier) protected final booleanisDefaultRollback(TestContext testContext) Determine whether or not to rollback transactions by default for the supplied test context.protected final booleanisRollback(TestContext testContext) Determine whether or not to rollback transactions for the supplied test context by taking into consideration the default rollback flag and a possible method-level override via the@Rollbackannotation.protected voidrunAfterTransactionMethods(TestContext testContext) Run all@AfterTransactionmethods for the specified test context.protected voidrunBeforeTransactionMethods(TestContext testContext) Run all@BeforeTransactionmethods for the specified test context.Methods inherited from class org.springframework.test.context.support.AbstractTestExecutionListener
afterTestClass, afterTestExecution, beforeTestClass, beforeTestExecution, prepareTestInstance
-
Field Details
-
attributeSource
-
-
Constructor Details
-
TransactionalTestExecutionListener
public TransactionalTestExecutionListener()
-
-
Method Details
-
getOrder
public final int getOrder()Returns4000.- Specified by:
getOrderin interfaceOrdered- Overrides:
getOrderin classAbstractTestExecutionListener- Returns:
- the order value
- See Also:
-
beforeTestMethod
If the test method of the supplied test context is configured to run within a transaction, this method will run@BeforeTransactionmethods and start a new transaction.Note that if a
@BeforeTransactionmethod fails, any remaining@BeforeTransactionmethods will not be invoked, and a transaction will not be started.- Specified by:
beforeTestMethodin interfaceTestExecutionListener- Overrides:
beforeTestMethodin classAbstractTestExecutionListener- Parameters:
testContext- the test context in which the test method will be executed; nevernull- Throws:
Exception- allows any exception to propagate- See Also:
-
afterTestMethod
If a transaction is currently active for the supplied test context, this method will end the transaction and run@AfterTransactionmethods.@AfterTransactionmethods are guaranteed to be invoked even if an error occurs while ending the transaction.- Specified by:
afterTestMethodin interfaceTestExecutionListener- Overrides:
afterTestMethodin classAbstractTestExecutionListener- Parameters:
testContext- the test context in which the test method was executed; nevernull- Throws:
Exception- allows any exception to propagate- See Also:
-
runBeforeTransactionMethods
Run all@BeforeTransactionmethods for the specified test context. If one of the methods fails, however, the caught exception will be rethrown in a wrappedRuntimeException, and the remaining methods will not be given a chance to execute.- Parameters:
testContext- the current test context- Throws:
Exception
-
runAfterTransactionMethods
Run all@AfterTransactionmethods for the specified test context. If one of the methods fails, the caught exception will be logged as an error, and the remaining methods will be given a chance to execute. After all methods have executed, the first caught exception, if any, will be rethrown.- Parameters:
testContext- the current test context- Throws:
Exception
-
getTransactionManager
@Nullable protected PlatformTransactionManager getTransactionManager(TestContext testContext, @Nullable String qualifier) Get the transaction manager to use for the supplied test context andqualifier.Delegates to
getTransactionManager(TestContext)if the suppliedqualifierisnullor empty.- Parameters:
testContext- the test context for which the transaction manager should be retrievedqualifier- the qualifier for selecting between multiple bean matches; may benullor empty- Returns:
- the transaction manager to use, or
nullif not found - Throws:
BeansException- if an error occurs while retrieving the transaction manager- See Also:
-
getTransactionManager
Get the transaction manager to use for the supplied test context.The default implementation simply delegates to
TestContextTransactionUtils.retrieveTransactionManager(org.springframework.test.context.TestContext, java.lang.String).- Parameters:
testContext- the test context for which the transaction manager should be retrieved- Returns:
- the transaction manager to use, or
nullif not found - Throws:
BeansException- if an error occurs while retrieving an explicitly named transaction managerIllegalStateException- if more than one TransactionManagementConfigurer exists in the ApplicationContext- See Also:
-
isDefaultRollback
Determine whether or not to rollback transactions by default for the supplied test context.- Parameters:
testContext- the test context for which the default rollback flag should be retrieved- Returns:
- the default rollback flag for the supplied test context
- Throws:
Exception- if an error occurs while determining the default rollback flag
-
isRollback
Determine whether or not to rollback transactions for the supplied test context by taking into consideration the default rollback flag and a possible method-level override via the@Rollbackannotation.- Parameters:
testContext- the test context for which the rollback flag should be retrieved- Returns:
- the rollback flag for the supplied test context
- Throws:
Exception- if an error occurs while determining the rollback flag
-