Skip to content

Commit

Permalink
Do not repopulate RequestContextHolder in ServTEL
Browse files Browse the repository at this point in the history
This commit fixes a bug introduced in the last commit.

ServletTestExecutionListener (STEL) now tracks whether it has already
populated the RequestContextHolder.

Issue: SPR-11144
  • Loading branch information
sbrannen committed Dec 11, 2013
1 parent 099b10d commit 800018a
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 5 deletions.
Expand Up @@ -20,7 +20,6 @@

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;
Expand Down Expand Up @@ -74,6 +73,16 @@ public class ServletTestExecutionListener extends AbstractTestExecutionListener
public static final String RESET_REQUEST_CONTEXT_HOLDER_ATTRIBUTE = Conventions.getQualifiedAttributeName(
ServletTestExecutionListener.class, "resetRequestContextHolder");

/**
* Attribute name for a {@link TestContext} attribute which indicates that
* {@code ServletTestExecutionListener} has already populated Spring Web's
* {@code RequestContextHolder}.
*
* <p>Permissible values include {@link Boolean#TRUE} and {@link Boolean#FALSE}.
*/
public static final String POPULATED_REQUEST_CONTEXT_HOLDER_ATTRIBUTE = Conventions.getQualifiedAttributeName(
ServletTestExecutionListener.class, "populatedRequestContextHolder");

private static final Log logger = LogFactory.getLog(ServletTestExecutionListener.class);


Expand Down Expand Up @@ -111,8 +120,10 @@ public void beforeTestMethod(TestContext testContext) throws Exception {
* {@code RequestContextHolder}, but only if the {@link
* #RESET_REQUEST_CONTEXT_HOLDER_ATTRIBUTE} in the supplied {@code TestContext}
* has a value of {@link Boolean#TRUE}.
* <p>The {@link #RESET_REQUEST_CONTEXT_HOLDER_ATTRIBUTE} will be
* subsequently removed from the test context, regardless of its value.
*
* <p>The {@link #RESET_REQUEST_CONTEXT_HOLDER_ATTRIBUTE} and
* {@link #POPULATED_REQUEST_CONTEXT_HOLDER_ATTRIBUTE} will be subsequently
* removed from the test context, regardless of their values.
*
* @see TestExecutionListener#afterTestMethod(TestContext)
*/
Expand All @@ -124,15 +135,20 @@ public void afterTestMethod(TestContext testContext) throws Exception {
}
RequestContextHolder.resetRequestAttributes();
}
testContext.removeAttribute(POPULATED_REQUEST_CONTEXT_HOLDER_ATTRIBUTE);
testContext.removeAttribute(RESET_REQUEST_CONTEXT_HOLDER_ATTRIBUTE);
}

private boolean notAnnotatedWithWebAppConfiguration(TestContext testContext) {
return AnnotationUtils.findAnnotation(testContext.getTestClass(), WebAppConfiguration.class) == null;
}

private boolean alreadyPopulatedRequestContextHolder(TestContext testContext) {
return Boolean.TRUE.equals(testContext.getAttribute(POPULATED_REQUEST_CONTEXT_HOLDER_ATTRIBUTE));
}

private void setUpRequestContextIfNecessary(TestContext testContext) {
if (notAnnotatedWithWebAppConfiguration(testContext)) {
if (notAnnotatedWithWebAppConfiguration(testContext) || alreadyPopulatedRequestContextHolder(testContext)) {
return;
}

Expand All @@ -157,6 +173,7 @@ private void setUpRequestContextIfNecessary(TestContext testContext) {
ServletWebRequest servletWebRequest = new ServletWebRequest(request, response);

RequestContextHolder.setRequestAttributes(servletWebRequest);
testContext.setAttribute(POPULATED_REQUEST_CONTEXT_HOLDER_ATTRIBUTE, Boolean.TRUE);
testContext.setAttribute(RESET_REQUEST_CONTEXT_HOLDER_ATTRIBUTE, Boolean.TRUE);

if (wac instanceof ConfigurableApplicationContext) {
Expand Down
Expand Up @@ -175,14 +175,18 @@ public void atWebAppConfigTestCaseWithPresetRequestAttributes() throws Exception
private void assertWebAppConfigTestCase() throws Exception {
listener.prepareTestInstance(testContext);
assertAttributeDoesNotExist();
verify(testContext, times(1)).setAttribute(POPULATED_REQUEST_CONTEXT_HOLDER_ATTRIBUTE, Boolean.TRUE);
verify(testContext, times(1)).setAttribute(RESET_REQUEST_CONTEXT_HOLDER_ATTRIBUTE, Boolean.TRUE);
when(testContext.getAttribute(POPULATED_REQUEST_CONTEXT_HOLDER_ATTRIBUTE)).thenReturn(Boolean.TRUE);
when(testContext.getAttribute(RESET_REQUEST_CONTEXT_HOLDER_ATTRIBUTE)).thenReturn(Boolean.TRUE);

listener.beforeTestMethod(testContext);
assertAttributeDoesNotExist();
verify(testContext, times(2)).setAttribute(RESET_REQUEST_CONTEXT_HOLDER_ATTRIBUTE, Boolean.TRUE);
verify(testContext, times(1)).setAttribute(POPULATED_REQUEST_CONTEXT_HOLDER_ATTRIBUTE, Boolean.TRUE);
verify(testContext, times(1)).setAttribute(RESET_REQUEST_CONTEXT_HOLDER_ATTRIBUTE, Boolean.TRUE);

listener.afterTestMethod(testContext);
verify(testContext).removeAttribute(POPULATED_REQUEST_CONTEXT_HOLDER_ATTRIBUTE);
verify(testContext).removeAttribute(RESET_REQUEST_CONTEXT_HOLDER_ATTRIBUTE);
assertAttributesNotAvailable();
}
Expand Down

0 comments on commit 800018a

Please sign in to comment.