From 5302566cbb71a0d1354bb55b7addf1a4fa965981 Mon Sep 17 00:00:00 2001 From: Sam Brannen Date: Sat, 9 Jul 2016 16:40:00 +0200 Subject: [PATCH] Introduce before/after test execution callbacks in TestExecutionListener Issue: SPR-4365 --- .../test/context/TestExecutionListener.java | 77 ++++++++++++++++--- 1 file changed, 68 insertions(+), 9 deletions(-) diff --git a/spring-test/src/main/java/org/springframework/test/context/TestExecutionListener.java b/spring-test/src/main/java/org/springframework/test/context/TestExecutionListener.java index 74fe7fc401..c2c7153700 100644 --- a/spring-test/src/main/java/org/springframework/test/context/TestExecutionListener.java +++ b/spring-test/src/main/java/org/springframework/test/context/TestExecutionListener.java @@ -55,6 +55,7 @@ package org.springframework.test.context; * @author Sam Brannen * @author Juergen Hoeller * @since 2.5 + * @see TestContextManager * @see org.springframework.test.context.support.AbstractTestExecutionListener */ public interface TestExecutionListener { @@ -70,6 +71,7 @@ public interface TestExecutionListener { * concrete classes as necessary. * @param testContext the test context for the test; never {@code null} * @throws Exception allows any exception to propagate + * @since 3.0 */ default void beforeTestClass(TestContext testContext) throws Exception { /* no-op */ @@ -90,34 +92,90 @@ public interface TestExecutionListener { } /** - * Pre-processes a test before execution of the + * Pre-processes a test before execution of before + * lifecycle callbacks of the underlying test framework — for example, + * by setting up test fixtures. + *

This method must be called immediately prior to + * framework-specific before lifecycle callbacks. For historical + * reasons, this method is named {@code beforeTestMethod}. Since the + * introduction of {@link #beforeTestExecution}, a more suitable name for + * this method might be something like {@code beforeTestSetUp} or + * {@code beforeEach}; however, it is unfortunately impossible to rename + * this method due to backward compatibility concerns. + *

The default implementation is empty. Can be overridden by + * concrete classes as necessary. + * @param testContext the test context in which the test method will be + * executed; never {@code null} + * @throws Exception allows any exception to propagate + * @see #afterTestMethod + * @see #beforeTestExecution + * @see #afterTestExecution + */ + default void beforeTestMethod(TestContext testContext) throws Exception { + /* no-op */ + } + + /** + * Pre-processes a test immediately before execution of the * {@link java.lang.reflect.Method test method} in the supplied - * {@link TestContext test context}, for example by setting up test - * fixtures. - *

This method should be called immediately prior to framework-specific + * {@link TestContext test context} — for example, for timing + * or logging purposes. + *

This method must be called after framework-specific * before lifecycle callbacks. *

The default implementation is empty. Can be overridden by * concrete classes as necessary. * @param testContext the test context in which the test method will be * executed; never {@code null} * @throws Exception allows any exception to propagate + * @since 5.0 + * @see #beforeTestMethod + * @see #afterTestMethod + * @see #afterTestExecution */ - default void beforeTestMethod(TestContext testContext) throws Exception { + default void beforeTestExecution(TestContext testContext) throws Exception { /* no-op */ } /** - * Post-processes a test after execution of the + * Post-processes a test immediately after execution of the * {@link java.lang.reflect.Method test method} in the supplied - * {@link TestContext test context}, for example by tearing down test - * fixtures. - *

This method should be called immediately after framework-specific + * {@link TestContext test context} — for example, for timing + * or logging purposes. + *

This method must be called before framework-specific * after lifecycle callbacks. *

The default implementation is empty. Can be overridden by * concrete classes as necessary. + * @param testContext the test context in which the test method will be + * executed; never {@code null} + * @throws Exception allows any exception to propagate + * @since 5.0 + * @see #beforeTestMethod + * @see #afterTestMethod + * @see #beforeTestExecution + */ + default void afterTestExecution(TestContext testContext) throws Exception { + /* no-op */ + } + + /** + * Post-processes a test after execution of after + * lifecycle callbacks of the underlying test framework — for example, + * by tearing down test fixtures. + *

This method must be called immediately after + * framework-specific after lifecycle callbacks. For historical + * reasons, this method is named {@code afterTestMethod}. Since the + * introduction of {@link #afterTestExecution}, a more suitable name for + * this method might be something like {@code afterTestTearDown} or + * {@code afterEach}; however, it is unfortunately impossible to rename + * this method due to backward compatibility concerns. + *

The default implementation is empty. Can be overridden by + * concrete classes as necessary. * @param testContext the test context in which the test method was * executed; never {@code null} * @throws Exception allows any exception to propagate + * @see #beforeTestMethod + * @see #beforeTestExecution + * @see #afterTestExecution */ default void afterTestMethod(TestContext testContext) throws Exception { /* no-op */ @@ -134,6 +192,7 @@ public interface TestExecutionListener { * concrete classes as necessary. * @param testContext the test context for the test; never {@code null} * @throws Exception allows any exception to propagate + * @since 3.0 */ default void afterTestClass(TestContext testContext) throws Exception { /* no-op */