diff --git a/spring-test/src/main/java/org/springframework/test/context/junit4/AbstractJUnit4SpringContextTests.java b/spring-test/src/main/java/org/springframework/test/context/junit4/AbstractJUnit4SpringContextTests.java index d16b05f8cf4..7fc7e2a9d3a 100644 --- a/spring-test/src/main/java/org/springframework/test/context/junit4/AbstractJUnit4SpringContextTests.java +++ b/spring-test/src/main/java/org/springframework/test/context/junit4/AbstractJUnit4SpringContextTests.java @@ -70,7 +70,7 @@ import org.springframework.test.context.web.ServletTestExecutionListener; * and specify your runner of choice via {@link RunWith @RunWith(...)}. * * - *
NOTE: As of Spring Framework 4.1, this class requires JUnit 4.9 or higher. + *
NOTE: As of Spring Framework 4.3, this class requires JUnit 4.12 or higher. * * @author Sam Brannen * @since 2.5 diff --git a/spring-test/src/main/java/org/springframework/test/context/junit4/AbstractTransactionalJUnit4SpringContextTests.java b/spring-test/src/main/java/org/springframework/test/context/junit4/AbstractTransactionalJUnit4SpringContextTests.java index 9745e597c16..5239813c940 100644 --- a/spring-test/src/main/java/org/springframework/test/context/junit4/AbstractTransactionalJUnit4SpringContextTests.java +++ b/spring-test/src/main/java/org/springframework/test/context/junit4/AbstractTransactionalJUnit4SpringContextTests.java @@ -73,7 +73,7 @@ import org.springframework.transaction.annotation.Transactional; * and specify your runner of choice via {@link org.junit.runner.RunWith @RunWith(...)}. * * - *
NOTE: As of Spring Framework 4.1, this class requires JUnit 4.9 or higher. + *
NOTE: As of Spring Framework 4.3, this class requires JUnit 4.12 or higher. * * @author Sam Brannen * @author Juergen Hoeller diff --git a/spring-test/src/main/java/org/springframework/test/context/junit4/SpringJUnit4ClassRunner.java b/spring-test/src/main/java/org/springframework/test/context/junit4/SpringJUnit4ClassRunner.java index 1d6a11f9e98..3cc11b59a02 100644 --- a/spring-test/src/main/java/org/springframework/test/context/junit4/SpringJUnit4ClassRunner.java +++ b/spring-test/src/main/java/org/springframework/test/context/junit4/SpringJUnit4ClassRunner.java @@ -18,6 +18,7 @@ package org.springframework.test.context.junit4; import java.lang.reflect.Field; import java.lang.reflect.Method; +import java.util.concurrent.TimeUnit; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -75,7 +76,7 @@ import org.springframework.util.ReflectionUtils; *
If you would like to use the Spring TestContext Framework with a runner * other than this one, use {@link SpringClassRule} and {@link SpringMethodRule}. * - *
NOTE: As of Spring Framework 4.1, this class requires JUnit 4.9 or higher. + *
NOTE: As of Spring Framework 4.3, this class requires JUnit 4.12 or higher. * * @author Sam Brannen * @author Juergen Hoeller @@ -92,27 +93,20 @@ public class SpringJUnit4ClassRunner extends BlockJUnit4ClassRunner { private static final Method withRulesMethod; - // Used by RunAfterTestClassCallbacks and RunAfterTestMethodCallbacks - private static final String MULTIPLE_FAILURE_EXCEPTION_CLASS_NAME = "org.junit.runners.model.MultipleFailureException"; - static { - boolean junit4dot9Present = ClassUtils.isPresent(MULTIPLE_FAILURE_EXCEPTION_CLASS_NAME, - SpringJUnit4ClassRunner.class.getClassLoader()); - if (!junit4dot9Present) { - throw new IllegalStateException(String.format( - "Failed to find class [%s]: SpringJUnit4ClassRunner requires JUnit 4.9 or higher.", - MULTIPLE_FAILURE_EXCEPTION_CLASS_NAME)); + if (!ClassUtils.isPresent("org.junit.internal.Throwables", SpringJUnit4ClassRunner.class.getClassLoader())) { + throw new IllegalStateException("SpringJUnit4ClassRunner requires JUnit 4.12 or higher."); } withRulesMethod = ReflectionUtils.findMethod(SpringJUnit4ClassRunner.class, "withRules", FrameworkMethod.class, Object.class, Statement.class); if (withRulesMethod == null) { - throw new IllegalStateException( - "Failed to find withRules() method: SpringJUnit4ClassRunner requires JUnit 4.9 or higher."); + throw new IllegalStateException("SpringJUnit4ClassRunner requires JUnit 4.12 or higher."); } ReflectionUtils.makeAccessible(withRulesMethod); } + private final TestContextManager testContextManager; @@ -376,8 +370,7 @@ public class SpringJUnit4ClassRunner extends BlockJUnit4ClassRunner { statement = new SpringFailOnTimeout(next, springTimeout); } else if (junitTimeout > 0) { - // TODO Use FailOnTimeout.builder() once JUnit 4.12 is the minimum supported version. - statement = new FailOnTimeout(next, junitTimeout); + statement = FailOnTimeout.builder().withTimeout(junitTimeout, TimeUnit.MILLISECONDS).build(next); } else { statement = next; diff --git a/spring-test/src/main/java/org/springframework/test/context/junit4/package-info.java b/spring-test/src/main/java/org/springframework/test/context/junit4/package-info.java index d322cc36b1d..0a93b26848b 100644 --- a/spring-test/src/main/java/org/springframework/test/context/junit4/package-info.java +++ b/spring-test/src/main/java/org/springframework/test/context/junit4/package-info.java @@ -1,4 +1,5 @@ /** - * Support classes for integrating the Spring TestContext Framework with JUnit. + * Support classes for integrating the Spring TestContext Framework + * with JUnit 4.12 or higher. */ package org.springframework.test.context.junit4; diff --git a/spring-test/src/main/java/org/springframework/test/context/junit4/rules/SpringClassRule.java b/spring-test/src/main/java/org/springframework/test/context/junit4/rules/SpringClassRule.java index 904a364383f..cbbe7437bc2 100644 --- a/spring-test/src/main/java/org/springframework/test/context/junit4/rules/SpringClassRule.java +++ b/spring-test/src/main/java/org/springframework/test/context/junit4/rules/SpringClassRule.java @@ -23,6 +23,7 @@ import java.util.concurrent.ConcurrentHashMap; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; + import org.junit.Rule; import org.junit.rules.TestRule; import org.junit.runner.Description; @@ -76,7 +77,7 @@ import org.springframework.util.ClassUtils; *
NOTE: This class requires JUnit 4.9 or higher. + *
NOTE: As of Spring Framework 4.3, this class requires JUnit 4.12 or higher.
*
* @author Sam Brannen
* @author Philippe Marschall
@@ -96,16 +97,9 @@ public class SpringClassRule implements TestRule {
private static final Map NOTE: This class requires JUnit 4.9 or higher.
+ * NOTE: As of Spring Framework 4.3, this class requires JUnit 4.12 or higher.
*
* @author Sam Brannen
* @author Philippe Marschall
@@ -93,16 +94,9 @@ public class SpringMethodRule implements MethodRule {
private static final Log logger = LogFactory.getLog(SpringMethodRule.class);
- // Used by RunAfterTestMethodCallbacks
- private static final String MULTIPLE_FAILURE_EXCEPTION_CLASS_NAME = "org.junit.runners.model.MultipleFailureException";
-
static {
- boolean junit4dot9Present = ClassUtils.isPresent(MULTIPLE_FAILURE_EXCEPTION_CLASS_NAME,
- SpringMethodRule.class.getClassLoader());
- if (!junit4dot9Present) {
- throw new IllegalStateException(String.format(
- "Failed to find class [%s]: SpringMethodRule requires JUnit 4.9 or higher.",
- MULTIPLE_FAILURE_EXCEPTION_CLASS_NAME));
+ if (!ClassUtils.isPresent("org.junit.internal.Throwables", SpringMethodRule.class.getClassLoader())) {
+ throw new IllegalStateException("SpringMethodRule requires JUnit 4.12 or higher.");
}
}
diff --git a/spring-test/src/main/java/org/springframework/test/context/junit4/statements/ProfileValueChecker.java b/spring-test/src/main/java/org/springframework/test/context/junit4/statements/ProfileValueChecker.java
index 144c4154e96..e2b5195ae08 100644
--- a/spring-test/src/main/java/org/springframework/test/context/junit4/statements/ProfileValueChecker.java
+++ b/spring-test/src/main/java/org/springframework/test/context/junit4/statements/ProfileValueChecker.java
@@ -19,7 +19,7 @@ package org.springframework.test.context.junit4.statements;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
-import org.junit.Assume;
+import org.junit.AssumptionViolatedException;
import org.junit.runners.model.Statement;
import org.springframework.core.annotation.AnnotationUtils;
@@ -76,27 +76,24 @@ public class ProfileValueChecker extends Statement {
* will simply evaluate the next {@link Statement} in the execution chain.
* @see ProfileValueUtils#isTestEnabledInThisEnvironment(Class)
* @see ProfileValueUtils#isTestEnabledInThisEnvironment(Method, Class)
- * @see org.junit.Assume
+ * @throws AssumptionViolatedException if the test is disabled
+ * @throws Throwable if evaluation of the next statement fails
*/
@Override
public void evaluate() throws Throwable {
if (this.testMethod == null) {
if (!ProfileValueUtils.isTestEnabledInThisEnvironment(this.testClass)) {
- // Invoke assumeTrue() with false to avoid direct reference to JUnit's
- // AssumptionViolatedException which exists in two packages as of JUnit 4.12.
Annotation ann = AnnotationUtils.findAnnotation(this.testClass, IfProfileValue.class);
- Assume.assumeTrue(String.format(
- "Profile configured via [%s] is not enabled in this environment for test class [%s].",
- ann, this.testClass.getName()), false);
+ throw new AssumptionViolatedException(
+ String.format("Profile configured via [%s] is not enabled in this environment for test class [%s].",
+ ann, this.testClass.getName()));
}
}
else {
if (!ProfileValueUtils.isTestEnabledInThisEnvironment(this.testMethod, this.testClass)) {
- // Invoke assumeTrue() with false to avoid direct reference to JUnit's
- // AssumptionViolatedException which exists in two packages as of JUnit 4.12.
- Assume.assumeTrue(String.format(
- "Profile configured via @IfProfileValue is not enabled in this environment for test method [%s].",
- this.testMethod), false);
+ throw new AssumptionViolatedException(String.format(
+ "Profile configured via @IfProfileValue is not enabled in this environment for test method [%s].",
+ this.testMethod));
}
}
diff --git a/spring-test/src/main/java/org/springframework/test/context/junit4/statements/RunAfterTestClassCallbacks.java b/spring-test/src/main/java/org/springframework/test/context/junit4/statements/RunAfterTestClassCallbacks.java
index e7946dd6f3e..bf05536a476 100644
--- a/spring-test/src/main/java/org/springframework/test/context/junit4/statements/RunAfterTestClassCallbacks.java
+++ b/spring-test/src/main/java/org/springframework/test/context/junit4/statements/RunAfterTestClassCallbacks.java
@@ -80,13 +80,7 @@ public class RunAfterTestClassCallbacks extends Statement {
errors.add(ex);
}
- if (errors.isEmpty()) {
- return;
- }
- if (errors.size() == 1) {
- throw errors.get(0);
- }
- throw new MultipleFailureException(errors);
+ MultipleFailureException.assertEmpty(errors);
}
}
diff --git a/spring-test/src/main/java/org/springframework/test/context/junit4/statements/RunAfterTestMethodCallbacks.java b/spring-test/src/main/java/org/springframework/test/context/junit4/statements/RunAfterTestMethodCallbacks.java
index 1a1aa877d46..e07712641e8 100644
--- a/spring-test/src/main/java/org/springframework/test/context/junit4/statements/RunAfterTestMethodCallbacks.java
+++ b/spring-test/src/main/java/org/springframework/test/context/junit4/statements/RunAfterTestMethodCallbacks.java
@@ -97,13 +97,7 @@ public class RunAfterTestMethodCallbacks extends Statement {
errors.add(ex);
}
- if (errors.isEmpty()) {
- return;
- }
- if (errors.size() == 1) {
- throw errors.get(0);
- }
- throw new MultipleFailureException(errors);
+ MultipleFailureException.assertEmpty(errors);
}
}
diff --git a/src/asciidoc/testing.adoc b/src/asciidoc/testing.adoc
index 59f8efd8193..eedd2cd138c 100644
--- a/src/asciidoc/testing.adoc
+++ b/src/asciidoc/testing.adoc
@@ -3623,8 +3623,8 @@ be automatically rolled back by the `TransactionalTestExecutionListener` (see
[[testcontext-junit4-runner]]
===== Spring JUnit Runner
-The __Spring TestContext Framework__ offers full integration with JUnit 4.9+ through a
-custom runner (supported on JUnit 4.9 through 4.12). By annotating test classes with
+The __Spring TestContext Framework__ offers full integration with JUnit 4 through a
+custom runner (supported on JUnit 4.12 or higher). By annotating test classes with
`@RunWith(SpringJUnit4ClassRunner.class)`, developers can implement standard JUnit-based
unit and integration tests and simultaneously reap the benefits of the TestContext
framework such as support for loading application contexts, dependency injection of test
@@ -3657,7 +3657,7 @@ public class SimpleTest {
===== Spring JUnit Rules
The `org.springframework.test.context.junit4.rules` package provides the following JUnit
-rules.
+4 rules (supported on JUnit 4.12 or higher).
* `SpringClassRule`
* `SpringMethodRule`
@@ -3701,14 +3701,14 @@ public class IntegrationTest {
===== JUnit support classes
The `org.springframework.test.context.junit4` package provides the following support
-classes for JUnit-based test cases.
+classes for JUnit-based test cases (supported on JUnit 4.12 or higher).
* `AbstractJUnit4SpringContextTests`
* `AbstractTransactionalJUnit4SpringContextTests`
`AbstractJUnit4SpringContextTests` is an abstract base test class that integrates the
__Spring TestContext Framework__ with explicit `ApplicationContext` testing support in
-a JUnit 4.9+ environment. When you extend `AbstractJUnit4SpringContextTests`, you can
+a JUnit 4 environment. When you extend `AbstractJUnit4SpringContextTests`, you can
access a `protected` `applicationContext` instance variable that can be used to perform
explicit bean lookups or to test the state of the context as a whole.
diff --git a/src/asciidoc/whats-new.adoc b/src/asciidoc/whats-new.adoc
index 5ad8910db53..53d7701f473 100644
--- a/src/asciidoc/whats-new.adoc
+++ b/src/asciidoc/whats-new.adoc
@@ -622,3 +622,11 @@ public @interface MyTestConfig {
support for date header formatting via the `getDateHeader` and `setDateHeader`
methods.
+
+
+[[new-in-4.3]]
+== New Features and Enhancements in Spring Framework 4.3
+
+=== Testing Improvements
+
+* The JUnit support in the _Spring TestContext Framework_ now requires JUnit 4.12 or higher.