package com.zqh.classloader; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import com.zqh.classloader.v2.MyBean; import org.junit.Test; public class ClassLoaderTest { public static final String JARS_DIR = System.getProperty("user.dir") + "/src/test/resources"; @Test public void testLocalClass() throws ClassNotFoundException, InstantiationException, IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException { MyBean myBean = new MyBean(); assertEquals("v2", myBean.toString()); assertEquals("paolo.test.custom_classloader.support.MyBean", myBean .getClass().getName()); } @Test public void testManuallyLoadedClass() throws ClassNotFoundException, InstantiationException, IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException { DirectoryBasedParentLastURLClassLoader classLoader = new DirectoryBasedParentLastURLClassLoader( ClassLoaderTest.JARS_DIR ); Class<?> classManuallyLoaded = classLoader .loadClass("paolo.test.custom_classloader.support.MyBean"); Object myBeanInstanceFromReflection = classManuallyLoaded.newInstance(); Method methodToString = classManuallyLoaded.getMethod("toString"); assertEquals("v1", methodToString.invoke(myBeanInstanceFromReflection)); } @Test public void testDifferentClassloaders() throws ClassNotFoundException, InstantiationException, IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException { MyBean myBean = new MyBean(); DirectoryBasedParentLastURLClassLoader classLoader = new DirectoryBasedParentLastURLClassLoader( JARS_DIR); Class<?> classManuallyLoaded = classLoader .loadClass("paolo.test.custom_classloader.support.MyBean"); Object myBeanInstanceFromReflection = classManuallyLoaded.newInstance(); assertNotEquals(myBean.getClass(), myBeanInstanceFromReflection.getClass()); } @Test public void testCannotCast() throws ClassNotFoundException, InstantiationException, IllegalAccessException { DirectoryBasedParentLastURLClassLoader classLoader = new DirectoryBasedParentLastURLClassLoader( JARS_DIR); Class<?> classManuallyLoaded = classLoader .loadClass("paolo.test.custom_classloader.support.MyBean"); Object myBeanInstanceFromReflection = classManuallyLoaded.newInstance(); try { MyBean myBean = (MyBean) myBeanInstanceFromReflection; fail("An exception was expected here, condition"); } catch (ClassCastException e) { assertTrue("the expected exception has been raised", true); } } @Test public void testExtraMethod() throws ClassNotFoundException, InstantiationException, IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException { DirectoryBasedParentLastURLClassLoader classLoader = new DirectoryBasedParentLastURLClassLoader( JARS_DIR); Class<?> classManuallyLoaded = classLoader .loadClass("paolo.test.custom_classloader.support.MyBean"); Object myBeanInstanceFromReflection = classManuallyLoaded.newInstance(); Method methodToString = classManuallyLoaded.getMethod("extraMehtod"); assertEquals("extra_value", methodToString.invoke(myBeanInstanceFromReflection)); } }