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 org.springframework.transaction.interceptor.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 org.springframework.transaction.PlatformTransactionManager |
getTransactionManager(TestContext testContext)
Get the
transaction manager to use
for the supplied test context. |
protected org.springframework.transaction.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 org.springframework.transaction.interceptor.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 org.springframework.transaction.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 foundorg.springframework.beans.BeansException - if an error occurs while retrieving the transaction managergetTransactionManager(TestContext)protected org.springframework.transaction.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 foundorg.springframework.beans.BeansException - 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