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 560059057e..1d6a11f9e9 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 @@ -21,6 +21,7 @@ import java.lang.reflect.Method; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; + import org.junit.Ignore; import org.junit.Test; import org.junit.internal.runners.model.ReflectiveCallable; @@ -45,6 +46,7 @@ import org.springframework.test.context.junit4.statements.RunBeforeTestClassCall import org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks; import org.springframework.test.context.junit4.statements.SpringFailOnTimeout; import org.springframework.test.context.junit4.statements.SpringRepeat; +import org.springframework.util.ClassUtils; import org.springframework.util.ReflectionUtils; /** @@ -90,7 +92,18 @@ 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)); + } + withRulesMethod = ReflectionUtils.findMethod(SpringJUnit4ClassRunner.class, "withRules", FrameworkMethod.class, Object.class, Statement.class); if (withRulesMethod == null) { 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 be1ea7f8d3..8166389de1 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 @@ -34,6 +34,7 @@ import org.springframework.test.context.junit4.statements.ProfileValueChecker; import org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks; import org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks; import org.springframework.util.Assert; +import org.springframework.util.ClassUtils; /** * {@code SpringClassRule} is a custom JUnit {@link TestRule} that supports @@ -96,6 +97,19 @@ public class SpringClassRule implements TestRule { private static final Map, TestContextManager> testContextManagerCache = new ConcurrentHashMap, TestContextManager>(64); + // Used by RunAfterTestClassCallbacks + private static final String MULTIPLE_FAILURE_EXCEPTION_CLASS_NAME = "org.junit.runners.model.MultipleFailureException"; + + static { + boolean junit4dot9Present = ClassUtils.isPresent(MULTIPLE_FAILURE_EXCEPTION_CLASS_NAME, + SpringClassRule.class.getClassLoader()); + if (!junit4dot9Present) { + throw new IllegalStateException(String.format( + "Failed to find class [%s]: SpringClassRule requires JUnit 4.9 or higher.", + MULTIPLE_FAILURE_EXCEPTION_CLASS_NAME)); + } + } + /** * Apply class-level features of the Spring TestContext diff --git a/spring-test/src/main/java/org/springframework/test/context/junit4/rules/SpringMethodRule.java b/spring-test/src/main/java/org/springframework/test/context/junit4/rules/SpringMethodRule.java index 481f1a4b3f..b419f35d3b 100644 --- a/spring-test/src/main/java/org/springframework/test/context/junit4/rules/SpringMethodRule.java +++ b/spring-test/src/main/java/org/springframework/test/context/junit4/rules/SpringMethodRule.java @@ -33,6 +33,7 @@ import org.springframework.test.context.junit4.statements.RunBeforeTestMethodCal import org.springframework.test.context.junit4.statements.RunPrepareTestInstanceCallbacks; import org.springframework.test.context.junit4.statements.SpringFailOnTimeout; import org.springframework.test.context.junit4.statements.SpringRepeat; +import org.springframework.util.ClassUtils; import org.springframework.util.ReflectionUtils; /** @@ -93,6 +94,19 @@ 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)); + } + } + /** * Apply instance-level and method-level features of