From d883efcb2a1f799c4796c849fa377e4717c4203c Mon Sep 17 00:00:00 2001 From: Sam Brannen Date: Mon, 28 Sep 2015 20:15:40 +0200 Subject: [PATCH] Throw meaningful exception if JUnit 4.9 is not present SpringJUnit4ClassRunner, SpringClassRule, and SpringMethodRule now throw an IllegalStateException with a meaningful message if JUnit 4.9 is not present in the classpath (specifically if org.junit.runners.model.MultipleFailureException cannot be loaded). Issue: SPR-13521 --- .../context/junit4/SpringJUnit4ClassRunner.java | 13 +++++++++++++ .../test/context/junit4/rules/SpringClassRule.java | 14 ++++++++++++++ .../context/junit4/rules/SpringMethodRule.java | 14 ++++++++++++++ 3 files changed, 41 insertions(+) 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 -- GitLab