Class EventPublishingTestExecutionListener

All Implemented Interfaces:
Ordered, TestExecutionListener

public class EventPublishingTestExecutionListener extends AbstractTestExecutionListener
TestExecutionListener that publishes test execution events to the ApplicationContext for the currently executing test.

Supported Events

These events may be consumed for various reasons, such as resetting mock beans or tracing test execution. One advantage of consuming test events rather than implementing a custom TestExecutionListener is that test events may be consumed by any Spring bean registered in the test ApplicationContext, and such beans may benefit directly from dependency injection and other features of the ApplicationContext. In contrast, a TestExecutionListener is not a bean in the ApplicationContext.

Note that the EventPublishingTestExecutionListener is registered by default; however, it only publishes events if the ApplicationContext has already been loaded. This prevents the ApplicationContext from being loaded unnecessarily or too early. Consequently, a BeforeTestClassEvent will not be published until after the ApplicationContext has been loaded by another TestExecutionListener. For example, with the default set of TestExecutionListeners registered, a BeforeTestClassEvent will not be published for the first test class that uses a particular test ApplicationContext, but a BeforeTestClassEvent will be published for any subsequent test class in the same test suite that uses the same test ApplicationContext since the context will already have been loaded when subsequent test classes run (as long as the context has not been removed from the ContextCache via @DirtiesContext or the max-size eviction policy). If you wish to ensure that a BeforeTestClassEvent is published for every test class, you need to register a TestExecutionListener that loads the ApplicationContext in the beforeTestClass callback, and that TestExecutionListener must be registered before the EventPublishingTestExecutionListener. Similarly, if @DirtiesContext is used to remove the ApplicationContext from the context cache after the last test method in a given test class, the AfterTestClassEvent will not be published for that test class.

Exception Handling

By default, if a test event listener throws an exception while consuming a test event, that exception will propagate to the underlying testing framework in use. For example, if the consumption of a BeforeTestMethodEvent results in an exception, the corresponding test method will fail as a result of the exception. In contrast, if an asynchronous test event listener throws an exception, the exception will not propagate to the underlying testing framework. For further details on asynchronous exception handling, consult the class-level Javadoc for @EventListener.

Asynchronous Listeners

If you want a particular test event listener to process events asynchronously, you can use Spring's @Async support. For further details, consult the class-level Javadoc for @EventListener.

Sam Brannen, Frank Scheffler
See Also: