public class TransactionalTestExecutionListener extends AbstractTestExecutionListener
TestExecutionListener that provides support for executing tests
within transactions by honoring the
@Transactional
annotation. Expects a PlatformTransactionManager bean to be defined in the
Spring ApplicationContext for the test.
Changes to the database during a test that is run with @Transactional
will be run within a transaction that will, by default, be automatically
rolled back after completion of the test. Test methods that are not
annotated with @Transactional (at the class or method level) will not
be run within a transaction.
Transactional commit and rollback behavior can be configured via the
class-level @TransactionConfiguration and
method-level @Rollback annotations.
In case there are multiple instances of PlatformTransactionManager
within the test's ApplicationContext, @TransactionConfiguration
supports configuring the bean name of the PlatformTransactionManager
that should be used to drive transactions. Alternatively,
TransactionManagementConfigurer can be implemented in an
@Configuration
class.
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 and
@AfterTransaction.
TransactionConfiguration,
TransactionManagementConfigurer,
Transactional,
Rollback,
BeforeTransaction,
AfterTransaction| Modifier and Type | Field and Description |
|---|---|
protected TransactionAttributeSource |
attributeSource |
| Constructor and Description |
|---|
TransactionalTestExecutionListener() |
| Modifier and Type | Method and Description |
|---|---|
void |
afterTestMethod(TestContext testContext)
If a transaction is currently active for the test method of the supplied
test context, this method will end the transaction
and run @AfterTransaction methods. |
void |
beforeTestMethod(TestContext testContext)
If the test method of the supplied
test context is
configured to run within a transaction, this method will run
@BeforeTransaction methods and start a new
transaction. |
protected PlatformTransactionManager |
getTransactionManager(TestContext testContext)
Get the
transaction manager to use
for the supplied test context. |
protected PlatformTransactionManager |
getTransactionManager(TestContext testContext,
String qualifier)
|
protected boolean |
isDefaultRollback(TestContext testContext)
Determine whether or not to rollback transactions by default for the
supplied
test context. |
protected boolean |
isRollback(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 Rollback annotation. |
protected void |
runAfterTransactionMethods(TestContext testContext)
Run all
@AfterTransaction methods for the
specified test context. |
protected void |
runBeforeTransactionMethods(TestContext testContext)
Run all
@BeforeTransaction methods for the
specified test context. |
afterTestClass, beforeTestClass, prepareTestInstanceprotected final TransactionAttributeSource attributeSource
public void beforeTestMethod(TestContext testContext) throws Exception
test context is
configured to run within a transaction, this method will run
@BeforeTransaction methods and start a new
transaction.
Note that if a @BeforeTransaction method fails, any remaining
@BeforeTransaction methods will not be invoked, and a transaction
will not be started.
beforeTestMethod in interface TestExecutionListenerbeforeTestMethod in class AbstractTestExecutionListenertestContext - the test context in which the test method will be
executed; never nullException - allows any exception to propagateTransactional,
getTransactionManager(TestContext, String)public void afterTestMethod(TestContext testContext) throws Exception
test context, this method will end the transaction
and run @AfterTransaction methods.
@AfterTransaction methods are guaranteed to be
invoked even if an error occurs while ending the transaction.
afterTestMethod in interface TestExecutionListenerafterTestMethod in class AbstractTestExecutionListenertestContext - the test context in which the test method was
executed; never nullException - allows any exception to propagateprotected void runBeforeTransactionMethods(TestContext testContext) throws Exception
@BeforeTransaction methods for the
specified test context. If one of the methods fails,
however, the caught exception will be rethrown in a wrapped
RuntimeException, and the remaining methods will not
be given a chance to execute.testContext - the current test contextExceptionprotected void runAfterTransactionMethods(TestContext testContext) throws Exception
@AfterTransaction methods 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.testContext - the current test contextExceptionprotected PlatformTransactionManager getTransactionManager(TestContext testContext, String qualifier)
transaction manager to use
for the supplied test context and qualifier.
Delegates to getTransactionManager(TestContext) if the
supplied qualifier is null or empty.
testContext - the test context for which the transaction manager
should be retrievedqualifier - the qualifier for selecting between multiple bean matches;
may be null or emptynull if not foundBeansException - if an error occurs while retrieving the transaction managergetTransactionManager(TestContext)protected PlatformTransactionManager getTransactionManager(TestContext testContext)
transaction manager to use
for the supplied test context.testContext - the test context for which the transaction manager
should be retrievednull if not foundBeansException - if an error occurs while retrieving the transaction managergetTransactionManager(TestContext, String)protected final boolean isDefaultRollback(TestContext testContext) throws Exception
test context.testContext - the test context for which the default rollback flag
should be retrievedException - if an error occurs while determining the default rollback flagprotected final boolean isRollback(TestContext testContext) throws Exception
test context by taking into consideration the
default rollback flag and a
possible method-level override via the Rollback annotation.testContext - the test context for which the rollback flag
should be retrievedException - if an error occurs while determining the rollback flag