View Javadoc
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  }