1 package top.infra.test.classloader.multi;
2
3 import lombok.SneakyThrows;
4
5 import org.junit.runner.Runner;
6 import org.junit.runners.BlockJUnit4ClassRunner;
7 import org.junit.runners.Suite;
8 import org.junit.runners.model.InitializationError;
9
10 import java.net.URLClassLoader;
11 import java.util.ArrayList;
12 import java.util.List;
13
14 import top.infra.test.classloader.ClassLoaderChangerRunner;
15
16 public class MultiClassLoaderJunitRunner extends Suite {
17
18 private static URLClassLoader currentClassLoader;
19
20 static {
21 currentClassLoader = (URLClassLoader) Thread.currentThread().getContextClassLoader();
22 }
23
24 public MultiClassLoaderJunitRunner(final Class<?> klass) throws InitializationError {
25 super(klass, buildRunners(klass));
26 }
27
28 @SneakyThrows
29 private static List<Runner> buildRunners(Class<?> klass) {
30 final LibrarySets librarySet = klass.getAnnotation(LibrarySets.class);
31 if (librarySet == null) throw new IllegalArgumentException("Class " + klass + " is missing LibrarySets annotation");
32
33 final List<Runner> runners = new ArrayList<>();
34 int i = 0;
35 for (final String urlsList : librarySet.librarySets()) {
36 final String suffix = String.valueOf(i);
37
38 final ClassLoader customClassLoader = new LibrarySetClassLoader(currentClassLoader, urlsList.split(","));
39
40 final Class<?> testClass = customClassLoader.loadClass(klass.getName());
41
42 final BlockJUnit4ClassRunner junit4Runner = new BlockJUnit4ClassRunner(testClass) {
43 @Override
44 protected String getName() {
45 return super.getName() + suffix;
46 }
47 };
48
49 runners.add(new ClassLoaderChangerRunner(currentClassLoader, customClassLoader, junit4Runner));
50 i++;
51 }
52 return runners;
53 }
54 }