package ru.vyarus.guice.ext.generator;
import org.junit.Assert;
import org.junit.Test;
import ru.vyarus.guice.ext.core.generator.DynamicClassGenerator;
import ru.vyarus.guice.ext.generator.support.classloader.SampleBean;
import java.net.URL;
import java.net.URLClassLoader;
/**
* @author Vyacheslav Rusakov
* @since 01.06.2016
*/
public class ClassloaderCheckTest {
@Test
public void checkClassLoaderBinding() throws Exception {
// custom classloader used to load classes (parent implicitly set to ext instead of system
// to avoid classpath entry load)
final URL[] classpath = {ClassloaderCheckTest.class.getResource("/")};
final ClassLoader extCL = ClassLoader.getSystemClassLoader().getParent();
ClassLoader cl = new URLClassLoader(classpath, extCL);
// loading abstract type
final String typeName = SampleBean.class.getName();
Class<?> type = cl.loadClass(typeName);
Assert.assertEquals(cl, type.getClassLoader());
// generated class must be assigned to custom classloader
Class<?> generated = DynamicClassGenerator.generate(type);
Assert.assertEquals(cl, generated.getClassLoader());
// now change classloader to make sure class will be re-generated (correct javassist usage)
ClassLoader cl2 = new URLClassLoader(classpath, extCL);
// loading abstract type again with different cl
Class<?> type2 = cl2.loadClass(typeName);
Assert.assertEquals(cl2, type2.getClassLoader());
// generated class must be assigned to new custom classloader
Class<?> generated2 = DynamicClassGenerator.generate(type2);
Assert.assertEquals(cl2, generated2.getClassLoader());
}
}