Browse Source

Merge branch '1.4.x' into 1.5.x

pull/6961/merge
Andy Wilkinson 9 years ago
parent
commit
ac05b61df9
  1. 73
      spring-boot-junit-runners/src/main/java/org/springframework/boot/junit/runner/classpath/ModifiedClassPathRunner.java

73
spring-boot-junit-runners/src/main/java/org/springframework/boot/junit/runner/classpath/ModifiedClassPathRunner.java

@ -79,6 +79,19 @@ public class ModifiedClassPathRunner extends BlockJUnit4ClassRunner { @@ -79,6 +79,19 @@ public class ModifiedClassPathRunner extends BlockJUnit4ClassRunner {
}
}
@Override
protected Object createTest() throws Exception {
FilteredTestClass testClass = (FilteredTestClass) getTestClass();
return testClass.doWithFilteredContextClassLoader(
new FilteredTestClass.FilteredTcclAction<Object, Exception>() {
@Override
public Object perform() throws Exception {
return ModifiedClassPathRunner.super.createTest();
}
});
}
private URLClassLoader createTestClassLoader(Class<?> testClass) throws Exception {
URLClassLoader classLoader = (URLClassLoader) this.getClass().getClassLoader();
return new FilteredClassLoader(processUrls(extractUrls(classLoader), testClass),
@ -246,40 +259,60 @@ public class ModifiedClassPathRunner extends BlockJUnit4ClassRunner { @@ -246,40 +259,60 @@ public class ModifiedClassPathRunner extends BlockJUnit4ClassRunner {
List<FrameworkMethod> wrapped = new ArrayList<FrameworkMethod>(
methods.size());
for (FrameworkMethod frameworkMethod : methods) {
wrapped.add(new FilteredFrameworkMethod(this.classLoader,
frameworkMethod.getMethod()));
wrapped.add(new FilteredFrameworkMethod(frameworkMethod.getMethod()));
}
return wrapped;
}
}
/**
* Filtered version of JUnit's {@link FrameworkMethod}.
*/
private static final class FilteredFrameworkMethod extends FrameworkMethod {
private final ClassLoader classLoader;
private FilteredFrameworkMethod(ClassLoader classLoader, Method method) {
super(method);
this.classLoader = classLoader;
}
@Override
public Object invokeExplosively(Object target, Object... params)
throws Throwable {
private <T, E extends Throwable> T doWithFilteredContextClassLoader(
FilteredTcclAction<T, E> action) throws E {
ClassLoader originalClassLoader = Thread.currentThread()
.getContextClassLoader();
Thread.currentThread().setContextClassLoader(this.classLoader);
try {
return super.invokeExplosively(target, params);
return action.perform();
}
finally {
Thread.currentThread().setContextClassLoader(originalClassLoader);
}
}
/**
* An action to be performed with the {@link FilteredClassLoader} set as the
* thread context class loader.
*/
private interface FilteredTcclAction<T, E extends Throwable> {
T perform() throws E;
}
/**
* Filtered version of JUnit's {@link FrameworkMethod}.
*/
private final class FilteredFrameworkMethod extends FrameworkMethod {
private FilteredFrameworkMethod(Method method) {
super(method);
}
@Override
public Object invokeExplosively(final Object target, final Object... params)
throws Throwable {
return doWithFilteredContextClassLoader(
new FilteredTcclAction<Object, Throwable>() {
@Override
public Object perform() throws Throwable {
return FilteredFrameworkMethod.super.invokeExplosively(
target, params);
}
});
}
}
}
private static final class FilteredClassLoader extends URLClassLoader {

Loading…
Cancel
Save