|
|
|
|
@ -1,5 +1,5 @@
@@ -1,5 +1,5 @@
|
|
|
|
|
/* |
|
|
|
|
* Copyright 2002-2008 the original author or authors. |
|
|
|
|
* Copyright 2002-2009 the original author or authors. |
|
|
|
|
* |
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
|
|
|
* you may not use this file except in compliance with the License. |
|
|
|
|
@ -21,9 +21,9 @@ import java.lang.reflect.Modifier;
@@ -21,9 +21,9 @@ import java.lang.reflect.Modifier;
|
|
|
|
|
|
|
|
|
|
import junit.framework.AssertionFailedError; |
|
|
|
|
import junit.framework.TestCase; |
|
|
|
|
|
|
|
|
|
import org.apache.commons.logging.Log; |
|
|
|
|
import org.apache.commons.logging.LogFactory; |
|
|
|
|
|
|
|
|
|
import org.springframework.context.ApplicationContext; |
|
|
|
|
import org.springframework.context.ApplicationContextAware; |
|
|
|
|
import org.springframework.test.annotation.ExpectedException; |
|
|
|
|
@ -39,47 +39,67 @@ import org.springframework.test.context.support.DirtiesContextTestExecutionListe
@@ -39,47 +39,67 @@ import org.springframework.test.context.support.DirtiesContextTestExecutionListe
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* <p> |
|
|
|
|
* Abstract base {@link TestCase} which integrates the |
|
|
|
|
* <em>Spring TestContext Framework</em> with explicit |
|
|
|
|
* {@link ApplicationContext} testing support in a <strong>JUnit 3.8</strong> |
|
|
|
|
* environment. |
|
|
|
|
* Abstract base {@link TestCase} which integrates the <i>Spring TestContext |
|
|
|
|
* Framework</i> and explicit {@link ApplicationContext} testing support in a |
|
|
|
|
* <strong>JUnit 3.8</strong> environment. |
|
|
|
|
* </p> |
|
|
|
|
* <p> |
|
|
|
|
* Concrete subclasses: |
|
|
|
|
* </p> |
|
|
|
|
* <ul> |
|
|
|
|
* <li>Typically declare a class-level |
|
|
|
|
* {@link org.springframework.test.context.ContextConfiguration @ContextConfiguration} |
|
|
|
|
* annotation to configure the {@link ApplicationContext application context} |
|
|
|
|
* {@link org.springframework.test.context.ContextConfiguration#locations() resource locations}. |
|
|
|
|
* <em>If your test does not need to load an |
|
|
|
|
* application context, you may choose to omit the |
|
|
|
|
* {@link org.springframework.test.context.ContextConfiguration @ContextConfiguration} declaration and configure |
|
|
|
|
* the appropriate {@link org.springframework.test.context.TestExecutionListener TestExecutionListeners} |
|
|
|
|
* manually.</em></li> |
|
|
|
|
* {@link org.springframework.test.context.ContextConfiguration |
|
|
|
|
* @ContextConfiguration} annotation to configure the |
|
|
|
|
* {@link ApplicationContext application context} |
|
|
|
|
* {@link org.springframework.test.context.ContextConfiguration#locations() |
|
|
|
|
* resource locations}. <i>If your test does not need to load an application |
|
|
|
|
* context, you may choose to omit the |
|
|
|
|
* {@link org.springframework.test.context.ContextConfiguration |
|
|
|
|
* @ContextConfiguration} declaration and configure the appropriate |
|
|
|
|
* {@link org.springframework.test.context.TestExecutionListener |
|
|
|
|
* TestExecutionListeners} manually.</i></li> |
|
|
|
|
* <li>Must declare public constructors which match the signatures of |
|
|
|
|
* {@link #AbstractJUnit38SpringContextTests() AbstractJUnit38SpringContextTests()} |
|
|
|
|
* and |
|
|
|
|
* {@link #AbstractJUnit38SpringContextTests(String) AbstractJUnit38SpringContextTests(String)} |
|
|
|
|
* and delegate to <code>super();</code> and <code>super(name);</code> |
|
|
|
|
* respectively.</li> |
|
|
|
|
* {@link #AbstractJUnit38SpringContextTests() |
|
|
|
|
* AbstractJUnit38SpringContextTests()} and |
|
|
|
|
* {@link #AbstractJUnit38SpringContextTests(String) |
|
|
|
|
* AbstractJUnit38SpringContextTests(String)} and delegate to |
|
|
|
|
* <code>super();</code> and <code>super(name);</code> respectively.</li> |
|
|
|
|
* </ul> |
|
|
|
|
* <p> |
|
|
|
|
* The following list constitutes all annotations currently supported directly |
|
|
|
|
* by <code>AbstractJUnit38SpringContextTests</code>. |
|
|
|
|
* <em>(Note that additional annotations may be supported by various |
|
|
|
|
* {@link org.springframework.test.context.TestExecutionListener TestExecutionListeners})</em> |
|
|
|
|
* by <code>AbstractJUnit38SpringContextTests</code>. <i>(Note that additional |
|
|
|
|
* annotations may be supported by various |
|
|
|
|
* {@link org.springframework.test.context.TestExecutionListener |
|
|
|
|
* TestExecutionListeners})</i> |
|
|
|
|
* </p> |
|
|
|
|
* <ul> |
|
|
|
|
* <li>{@link org.springframework.test.annotation.DirtiesContext @DirtiesContext} |
|
|
|
|
* (via the configured {@link DirtiesContextTestExecutionListener})</li> |
|
|
|
|
* <li>{@link org.springframework.test.annotation.ProfileValueSourceConfiguration @ProfileValueSourceConfiguration}</li> |
|
|
|
|
* <li>{@link IfProfileValue @IfProfileValue}</li> |
|
|
|
|
* <li>{@link ExpectedException @ExpectedException}</li> |
|
|
|
|
* <li>{@link Timed @Timed}</li> |
|
|
|
|
* <li>{@link Repeat @Repeat}</li> |
|
|
|
|
* <li>{@link org.springframework.test.annotation.DirtiesContext |
|
|
|
|
* @DirtiesContext} (via the configured |
|
|
|
|
* {@link DirtiesContextTestExecutionListener}; only supported on methods for |
|
|
|
|
* JUnit 3.8)</li> |
|
|
|
|
* <li> |
|
|
|
|
* {@link org.springframework.test.annotation.ProfileValueSourceConfiguration |
|
|
|
|
* @ProfileValueSourceConfiguration}</li> |
|
|
|
|
* <li>{@link IfProfileValue @IfProfileValue}</li> |
|
|
|
|
* <li>{@link ExpectedException @ExpectedException}</li> |
|
|
|
|
* <li>{@link Timed @Timed}</li> |
|
|
|
|
* <li>{@link Repeat @Repeat}</li> |
|
|
|
|
* </ul> |
|
|
|
|
* |
|
|
|
|
* <p> |
|
|
|
|
* JUnit 3.8 does not support <i>before class</i> or <i>after class</i> |
|
|
|
|
* lifecycle callbacks. The following |
|
|
|
|
* {@link org.springframework.test.context.TestExecutionListener |
|
|
|
|
* TestExecutionListener} methods are therefore unsupported in a JUnit 3.8 |
|
|
|
|
* environment: |
|
|
|
|
* <ul> |
|
|
|
|
* <li> |
|
|
|
|
* {@link org.springframework.test.context.TestExecutionListener#beforeTestClass(org.springframework.test.context.TestContext) |
|
|
|
|
* beforeTestClass()}</li> |
|
|
|
|
* <li> |
|
|
|
|
* {@link org.springframework.test.context.TestExecutionListener#afterTestClass(org.springframework.test.context.TestContext) |
|
|
|
|
* afterTestClass()}</li> |
|
|
|
|
* </ul> |
|
|
|
|
* |
|
|
|
|
* @author Sam Brannen |
|
|
|
|
* @author Juergen Hoeller |
|
|
|
|
* @since 2.5 |
|
|
|
|
@ -90,7 +110,7 @@ import org.springframework.test.context.support.DirtiesContextTestExecutionListe
@@ -90,7 +110,7 @@ import org.springframework.test.context.support.DirtiesContextTestExecutionListe
|
|
|
|
|
* @see org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests |
|
|
|
|
* @see org.springframework.test.context.testng.AbstractTestNGSpringContextTests |
|
|
|
|
*/ |
|
|
|
|
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class}) |
|
|
|
|
@TestExecutionListeners( { DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class }) |
|
|
|
|
public abstract class AbstractJUnit38SpringContextTests extends TestCase implements ApplicationContextAware { |
|
|
|
|
|
|
|
|
|
private static int disabledTestCount = 0; |
|
|
|
|
@ -117,8 +137,8 @@ public abstract class AbstractJUnit38SpringContextTests extends TestCase impleme
@@ -117,8 +137,8 @@ public abstract class AbstractJUnit38SpringContextTests extends TestCase impleme
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* {@link ProfileValueSource} available to subclasses but primarily intended |
|
|
|
|
* for internal use to provide support for |
|
|
|
|
* {@link IfProfileValue @IfProfileValue}. |
|
|
|
|
* for internal use to provide support for {@link IfProfileValue |
|
|
|
|
* @IfProfileValue}. |
|
|
|
|
*/ |
|
|
|
|
protected final ProfileValueSource profileValueSource; |
|
|
|
|
|
|
|
|
|
@ -126,9 +146,9 @@ public abstract class AbstractJUnit38SpringContextTests extends TestCase impleme
@@ -126,9 +146,9 @@ public abstract class AbstractJUnit38SpringContextTests extends TestCase impleme
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Constructs a new AbstractJUnit38SpringContextTests instance; |
|
|
|
|
* initializes the internal {@link TestContextManager} for the current test; |
|
|
|
|
* and retrieves the configured (or default) {@link ProfileValueSource}. |
|
|
|
|
* Constructs a new AbstractJUnit38SpringContextTests instance; initializes |
|
|
|
|
* the internal {@link TestContextManager} for the current test; and |
|
|
|
|
* retrieves the configured (or default) {@link ProfileValueSource}. |
|
|
|
|
*/ |
|
|
|
|
public AbstractJUnit38SpringContextTests() { |
|
|
|
|
super(); |
|
|
|
|
@ -141,6 +161,7 @@ public abstract class AbstractJUnit38SpringContextTests extends TestCase impleme
@@ -141,6 +161,7 @@ public abstract class AbstractJUnit38SpringContextTests extends TestCase impleme
|
|
|
|
|
* supplied <code>name</code>; initializes the internal |
|
|
|
|
* {@link TestContextManager} for the current test; and retrieves the |
|
|
|
|
* configured (or default) {@link ProfileValueSource}. |
|
|
|
|
* |
|
|
|
|
* @param name the name of the current test to execute |
|
|
|
|
*/ |
|
|
|
|
public AbstractJUnit38SpringContextTests(String name) { |
|
|
|
|
@ -149,7 +170,6 @@ public abstract class AbstractJUnit38SpringContextTests extends TestCase impleme
@@ -149,7 +170,6 @@ public abstract class AbstractJUnit38SpringContextTests extends TestCase impleme
|
|
|
|
|
this.profileValueSource = ProfileValueUtils.retrieveProfileValueSource(getClass()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Sets the {@link ApplicationContext} to be used by this test instance, |
|
|
|
|
* provided via {@link ApplicationContextAware} semantics. |
|
|
|
|
@ -158,24 +178,26 @@ public abstract class AbstractJUnit38SpringContextTests extends TestCase impleme
@@ -158,24 +178,26 @@ public abstract class AbstractJUnit38SpringContextTests extends TestCase impleme
|
|
|
|
|
this.applicationContext = applicationContext; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Runs the <em>Spring TestContext Framework</em> test sequence. |
|
|
|
|
* <p>In addition to standard {@link TestCase#runBare()} semantics, this |
|
|
|
|
* <p> |
|
|
|
|
* In addition to standard {@link TestCase#runBare()} semantics, this |
|
|
|
|
* implementation performs the following: |
|
|
|
|
* <ul> |
|
|
|
|
* <li>Calls |
|
|
|
|
* {@link TestContextManager#prepareTestInstance(Object) prepareTestInstance()}, |
|
|
|
|
* {@link TestContextManager#beforeTestMethod(Object,Method) beforeTestMethod()}, |
|
|
|
|
* and |
|
|
|
|
* {@link TestContextManager#afterTestMethod(Object,Method,Throwable) afterTestMethod()} |
|
|
|
|
* on this test's {@link TestContextManager} at the appropriate test |
|
|
|
|
* execution points.</li> |
|
|
|
|
* <li>Provides support for {@link IfProfileValue @IfProfileValue}.</li> |
|
|
|
|
* <li>Provides support for {@link Repeat @Repeat}.</li> |
|
|
|
|
* <li>Provides support for {@link Timed @Timed}.</li> |
|
|
|
|
* <li>Provides support for {@link ExpectedException @ExpectedException}.</li> |
|
|
|
|
* <li>Calls {@link TestContextManager#prepareTestInstance(Object) |
|
|
|
|
* prepareTestInstance()}, |
|
|
|
|
* {@link TestContextManager#beforeTestMethod(Object,Method) |
|
|
|
|
* beforeTestMethod()}, and |
|
|
|
|
* {@link TestContextManager#afterTestMethod(Object,Method,Throwable) |
|
|
|
|
* afterTestMethod()} on this test's {@link TestContextManager} at the |
|
|
|
|
* appropriate test execution points.</li> |
|
|
|
|
* <li>Provides support for {@link IfProfileValue @IfProfileValue}.</li> |
|
|
|
|
* <li>Provides support for {@link Repeat @Repeat}.</li> |
|
|
|
|
* <li>Provides support for {@link Timed @Timed}.</li> |
|
|
|
|
* <li>Provides support for {@link ExpectedException |
|
|
|
|
* @ExpectedException}.</li> |
|
|
|
|
* </ul> |
|
|
|
|
* |
|
|
|
|
* @see ProfileValueUtils#isTestEnabledInThisEnvironment |
|
|
|
|
*/ |
|
|
|
|
@Override |
|
|
|
|
@ -189,6 +211,7 @@ public abstract class AbstractJUnit38SpringContextTests extends TestCase impleme
@@ -189,6 +211,7 @@ public abstract class AbstractJUnit38SpringContextTests extends TestCase impleme
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
runTestTimed(new TestExecutionCallback() { |
|
|
|
|
|
|
|
|
|
public void run() throws Throwable { |
|
|
|
|
runManaged(testMethod); |
|
|
|
|
} |
|
|
|
|
@ -214,10 +237,12 @@ public abstract class AbstractJUnit38SpringContextTests extends TestCase impleme
@@ -214,10 +237,12 @@ public abstract class AbstractJUnit38SpringContextTests extends TestCase impleme
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Runs a <em>timed</em> test via the supplied {@link TestExecutionCallback}, |
|
|
|
|
* providing support for the {@link Timed @Timed} annotation. |
|
|
|
|
* Runs a <em>timed</em> test via the supplied {@link TestExecutionCallback} |
|
|
|
|
* , providing support for the {@link Timed @Timed} annotation. |
|
|
|
|
* |
|
|
|
|
* @param tec the test execution callback to run |
|
|
|
|
* @param testMethod the actual test method: used to retrieve the <code>timeout</code> |
|
|
|
|
* @param testMethod the actual test method: used to retrieve the |
|
|
|
|
* <code>timeout</code> |
|
|
|
|
* @throws Throwable if any exception is thrown |
|
|
|
|
* @see Timed |
|
|
|
|
* @see #runTest |
|
|
|
|
@ -243,21 +268,22 @@ public abstract class AbstractJUnit38SpringContextTests extends TestCase impleme
@@ -243,21 +268,22 @@ public abstract class AbstractJUnit38SpringContextTests extends TestCase impleme
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Runs a test via the supplied {@link TestExecutionCallback}, providing |
|
|
|
|
* support for the {@link ExpectedException @ExpectedException} and |
|
|
|
|
* {@link Repeat @Repeat} annotations. |
|
|
|
|
* support for the {@link ExpectedException @ExpectedException} and |
|
|
|
|
* {@link Repeat @Repeat} annotations. |
|
|
|
|
* |
|
|
|
|
* @param tec the test execution callback to run |
|
|
|
|
* @param testMethod the actual test method: used to retrieve the |
|
|
|
|
* {@link ExpectedException @ExpectedException} and {@link Repeat @Repeat} annotations |
|
|
|
|
* {@link ExpectedException @ExpectedException} and {@link Repeat |
|
|
|
|
* @Repeat} annotations |
|
|
|
|
* @throws Throwable if any exception is thrown |
|
|
|
|
* @see ExpectedException |
|
|
|
|
* @see Repeat |
|
|
|
|
*/ |
|
|
|
|
private void runTest(TestExecutionCallback tec, Method testMethod) throws Throwable { |
|
|
|
|
ExpectedException expectedExceptionAnnotation = testMethod.getAnnotation(ExpectedException.class); |
|
|
|
|
boolean exceptionIsExpected = (expectedExceptionAnnotation != null && |
|
|
|
|
expectedExceptionAnnotation.value() != null); |
|
|
|
|
Class<? extends Throwable> expectedException = |
|
|
|
|
(exceptionIsExpected ? expectedExceptionAnnotation.value() : null); |
|
|
|
|
boolean exceptionIsExpected = (expectedExceptionAnnotation != null && expectedExceptionAnnotation.value() != null); |
|
|
|
|
Class<? extends Throwable> expectedException = (exceptionIsExpected ? expectedExceptionAnnotation.value() |
|
|
|
|
: null); |
|
|
|
|
|
|
|
|
|
Repeat repeat = testMethod.getAnnotation(Repeat.class); |
|
|
|
|
int runs = ((repeat != null) && (repeat.value() > 1)) ? repeat.value() : 1; |
|
|
|
|
@ -278,8 +304,8 @@ public abstract class AbstractJUnit38SpringContextTests extends TestCase impleme
@@ -278,8 +304,8 @@ public abstract class AbstractJUnit38SpringContextTests extends TestCase impleme
|
|
|
|
|
} |
|
|
|
|
if (!expectedException.isAssignableFrom(ex.getClass())) { |
|
|
|
|
// Wrap the unexpected throwable with an explicit message.
|
|
|
|
|
AssertionFailedError assertionError = new AssertionFailedError("Unexpected exception, expected <" + |
|
|
|
|
expectedException.getName() + "> but was <" + ex.getClass().getName() + ">"); |
|
|
|
|
AssertionFailedError assertionError = new AssertionFailedError("Unexpected exception, expected <" |
|
|
|
|
+ expectedException.getName() + "> but was <" + ex.getClass().getName() + ">"); |
|
|
|
|
assertionError.initCause(ex); |
|
|
|
|
throw assertionError; |
|
|
|
|
} |
|
|
|
|
@ -291,6 +317,7 @@ public abstract class AbstractJUnit38SpringContextTests extends TestCase impleme
@@ -291,6 +317,7 @@ public abstract class AbstractJUnit38SpringContextTests extends TestCase impleme
|
|
|
|
|
* Calls {@link TestContextManager#beforeTestMethod(Object,Method)} and |
|
|
|
|
* {@link TestContextManager#afterTestMethod(Object,Method,Throwable)} at |
|
|
|
|
* the appropriate test execution points. |
|
|
|
|
* |
|
|
|
|
* @param testMethod the test method to run |
|
|
|
|
* @throws Throwable if any exception is thrown |
|
|
|
|
* @see #runBare() |
|
|
|
|
@ -344,6 +371,7 @@ public abstract class AbstractJUnit38SpringContextTests extends TestCase impleme
@@ -344,6 +371,7 @@ public abstract class AbstractJUnit38SpringContextTests extends TestCase impleme
|
|
|
|
|
* Records the supplied test method as <em>disabled</em> in the current |
|
|
|
|
* environment by incrementing the total number of disabled tests and |
|
|
|
|
* logging a debug message. |
|
|
|
|
* |
|
|
|
|
* @param testMethod the test method that is disabled. |
|
|
|
|
* @see #getDisabledTestCount() |
|
|
|
|
*/ |
|
|
|
|
@ -357,8 +385,8 @@ public abstract class AbstractJUnit38SpringContextTests extends TestCase impleme
@@ -357,8 +385,8 @@ public abstract class AbstractJUnit38SpringContextTests extends TestCase impleme
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Private inner class that defines a callback analogous to |
|
|
|
|
* {@link Runnable}, just declaring Throwable. |
|
|
|
|
* Private inner class that defines a callback analogous to {@link Runnable} |
|
|
|
|
* , just declaring Throwable. |
|
|
|
|
*/ |
|
|
|
|
private static interface TestExecutionCallback { |
|
|
|
|
|
|
|
|
|
|