1 /* 2 * Copyright (c) 2007 Mockito contributors 3 * This program is made available under the terms of the MIT License. 4 */ 5 package org.mockitousage.configuration; 6 7 import static org.mockito.Mockito.mock; 8 9 import java.util.concurrent.Callable; 10 11 import org.junit.Test; 12 import org.mockito.internal.configuration.ConfigurationAccess; 13 import org.mockitoutil.SimplePerRealmReloadingClassLoader; 14 15 public class ClassCacheVersusClassReloadingTest { 16 // TODO refactor to use ClassLoaders 17 18 private SimplePerRealmReloadingClassLoader testMethodClassLoaderRealm = 19 new SimplePerRealmReloadingClassLoader(reloadMockito()); 20 21 @Test should_not_throw_ClassCastException_when_objenesis_cache_disabled()22 public void should_not_throw_ClassCastException_when_objenesis_cache_disabled() 23 throws Exception { 24 prepareMockitoAndDisableObjenesisCache(); 25 26 doInNewChildRealm( 27 testMethodClassLoaderRealm, 28 "org.mockitousage.configuration.ClassCacheVersusClassReloadingTest$DoTheMocking"); 29 doInNewChildRealm( 30 testMethodClassLoaderRealm, 31 "org.mockitousage.configuration.ClassCacheVersusClassReloadingTest$DoTheMocking"); 32 } 33 34 public static class DoTheMocking implements Callable<Object> { call()35 public Object call() throws Exception { 36 Class<?> clazz = 37 this.getClass() 38 .getClassLoader() 39 .loadClass("org.mockitousage.configuration.ClassToBeMocked"); 40 return mock(clazz); 41 } 42 } 43 doInNewChildRealm( ClassLoader parentRealm, String callableCalledInClassLoaderRealm)44 private static void doInNewChildRealm( 45 ClassLoader parentRealm, String callableCalledInClassLoaderRealm) throws Exception { 46 new SimplePerRealmReloadingClassLoader(parentRealm, reloadScope()) 47 .doInRealm(callableCalledInClassLoaderRealm); 48 } 49 reloadScope()50 private static SimplePerRealmReloadingClassLoader.ReloadClassPredicate reloadScope() { 51 return new SimplePerRealmReloadingClassLoader.ReloadClassPredicate() { 52 public boolean acceptReloadOf(String qualifiedName) { 53 return "org.mockitousage.configuration.ClassCacheVersusClassReloadingTest$DoTheMocking" 54 .equals(qualifiedName) 55 || "org.mockitousage.configuration.ClassToBeMocked".equals(qualifiedName); 56 } 57 }; 58 } 59 60 private void prepareMockitoAndDisableObjenesisCache() throws Exception { 61 testMethodClassLoaderRealm.doInRealm( 62 "org.mockitousage.configuration.ClassCacheVersusClassReloadingTest$PrepareMockito"); 63 } 64 65 public static class PrepareMockito implements Callable<Boolean> { 66 public Boolean call() throws Exception { 67 Class.forName("org.mockito.Mockito"); 68 ConfigurationAccess.getConfig().overrideEnableClassCache(false); 69 return Boolean.TRUE; 70 } 71 } 72 73 private static SimplePerRealmReloadingClassLoader.ReloadClassPredicate reloadMockito() { 74 return new SimplePerRealmReloadingClassLoader.ReloadClassPredicate() { 75 public boolean acceptReloadOf(String qualifiedName) { 76 return (!qualifiedName.contains("net.bytebuddy") 77 && qualifiedName.contains("org.mockito")); 78 } 79 }; 80 } 81 } 82