/* * Copyright (c) 2007 Mockito contributors * This program is made available under the terms of the MIT License. */ package org.mockitousage.configuration; import org.junit.Test; import org.mockito.internal.configuration.ConfigurationAccess; import org.mockitoutil.SimplePerRealmReloadingClassLoader; import java.util.concurrent.Callable; import static org.mockito.Mockito.mock; public class ClassCacheVersusClassReloadingTest { // TODO refactor to use ClassLoaders private SimplePerRealmReloadingClassLoader testMethodClassLoaderRealm = new SimplePerRealmReloadingClassLoader(reloadMockito()); @Test public void should_not_throw_ClassCastException_when_objenesis_cache_disabled() throws Exception { prepareMockitoAndDisableObjenesisCache(); doInNewChildRealm(testMethodClassLoaderRealm, "org.mockitousage.configuration.ClassCacheVersusClassReloadingTest$DoTheMocking"); doInNewChildRealm(testMethodClassLoaderRealm, "org.mockitousage.configuration.ClassCacheVersusClassReloadingTest$DoTheMocking"); } public static class DoTheMocking implements Callable<Object> { public Object call() throws Exception { Class<?> clazz = this.getClass().getClassLoader().loadClass("org.mockitousage.configuration.ClassToBeMocked"); return mock(clazz); } } private static void doInNewChildRealm(ClassLoader parentRealm, String callableCalledInClassLoaderRealm) throws Exception { new SimplePerRealmReloadingClassLoader(parentRealm, reloadScope()).doInRealm(callableCalledInClassLoaderRealm); } private static SimplePerRealmReloadingClassLoader.ReloadClassPredicate reloadScope() { return new SimplePerRealmReloadingClassLoader.ReloadClassPredicate() { public boolean acceptReloadOf(String qualifiedName) { return "org.mockitousage.configuration.ClassCacheVersusClassReloadingTest$DoTheMocking".equals(qualifiedName) || "org.mockitousage.configuration.ClassToBeMocked".equals(qualifiedName); } }; } private void prepareMockitoAndDisableObjenesisCache() throws Exception { testMethodClassLoaderRealm.doInRealm("org.mockitousage.configuration.ClassCacheVersusClassReloadingTest$PrepareMockito"); } public static class PrepareMockito implements Callable<Boolean> { public Boolean call() throws Exception { Class.forName("org.mockito.Mockito"); ConfigurationAccess.getConfig().overrideEnableClassCache(false); return Boolean.TRUE; } } private static SimplePerRealmReloadingClassLoader.ReloadClassPredicate reloadMockito() { return new SimplePerRealmReloadingClassLoader.ReloadClassPredicate() { public boolean acceptReloadOf(String qualifiedName) { return (!qualifiedName.contains("net.bytebuddy") && qualifiedName.contains("org.mockito")); } }; } }