Merge branch '1.4.x' into 1.5.x

This commit is contained in:
Andy Wilkinson 2016-11-21 10:42:35 +00:00
commit ac05b61df9
1 changed files with 53 additions and 20 deletions

View File

@ -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 { private URLClassLoader createTestClassLoader(Class<?> testClass) throws Exception {
URLClassLoader classLoader = (URLClassLoader) this.getClass().getClassLoader(); URLClassLoader classLoader = (URLClassLoader) this.getClass().getClassLoader();
return new FilteredClassLoader(processUrls(extractUrls(classLoader), testClass), return new FilteredClassLoader(processUrls(extractUrls(classLoader), testClass),
@ -246,38 +259,58 @@ public class ModifiedClassPathRunner extends BlockJUnit4ClassRunner {
List<FrameworkMethod> wrapped = new ArrayList<FrameworkMethod>( List<FrameworkMethod> wrapped = new ArrayList<FrameworkMethod>(
methods.size()); methods.size());
for (FrameworkMethod frameworkMethod : methods) { for (FrameworkMethod frameworkMethod : methods) {
wrapped.add(new FilteredFrameworkMethod(this.classLoader, wrapped.add(new FilteredFrameworkMethod(frameworkMethod.getMethod()));
frameworkMethod.getMethod()));
} }
return wrapped; return wrapped;
} }
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 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}. * Filtered version of JUnit's {@link FrameworkMethod}.
*/ */
private static final class FilteredFrameworkMethod extends FrameworkMethod { private final class FilteredFrameworkMethod extends FrameworkMethod {
private final ClassLoader classLoader; private FilteredFrameworkMethod(Method method) {
private FilteredFrameworkMethod(ClassLoader classLoader, Method method) {
super(method); super(method);
this.classLoader = classLoader;
} }
@Override @Override
public Object invokeExplosively(Object target, Object... params) public Object invokeExplosively(final Object target, final Object... params)
throws Throwable { throws Throwable {
ClassLoader originalClassLoader = Thread.currentThread() return doWithFilteredContextClassLoader(
.getContextClassLoader(); new FilteredTcclAction<Object, Throwable>() {
Thread.currentThread().setContextClassLoader(this.classLoader);
try { @Override
return super.invokeExplosively(target, params); public Object perform() throws Throwable {
return FilteredFrameworkMethod.super.invokeExplosively(
target, params);
} }
finally {
Thread.currentThread().setContextClassLoader(originalClassLoader); });
} }
} }
} }