• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
8 import org.junit.Test;
9 import org.mockito.internal.configuration.ConfigurationAccess;
10 import org.mockitoutil.SimplePerRealmReloadingClassLoader;
11 
12 import java.util.concurrent.Callable;
13 
14 import static org.mockito.Mockito.mock;
15 
16 public class ClassCacheVersusClassReloadingTest {
17     // TODO refactor to use ClassLoaders
18 
19     private SimplePerRealmReloadingClassLoader testMethodClassLoaderRealm = 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() throws Exception {
23         prepareMockitoAndDisableObjenesisCache();
24 
25         doInNewChildRealm(testMethodClassLoaderRealm, "org.mockitousage.configuration.ClassCacheVersusClassReloadingTest$DoTheMocking");
26         doInNewChildRealm(testMethodClassLoaderRealm, "org.mockitousage.configuration.ClassCacheVersusClassReloadingTest$DoTheMocking");
27     }
28 
29     public static class DoTheMocking implements Callable<Object> {
call()30         public Object call() throws Exception {
31             Class<?> clazz = this.getClass().getClassLoader().loadClass("org.mockitousage.configuration.ClassToBeMocked");
32             return mock(clazz);
33         }
34     }
35 
doInNewChildRealm(ClassLoader parentRealm, String callableCalledInClassLoaderRealm)36     private static void doInNewChildRealm(ClassLoader parentRealm, String callableCalledInClassLoaderRealm) throws Exception {
37         new SimplePerRealmReloadingClassLoader(parentRealm, reloadScope()).doInRealm(callableCalledInClassLoaderRealm);
38     }
39 
reloadScope()40     private static SimplePerRealmReloadingClassLoader.ReloadClassPredicate reloadScope() {
41         return new SimplePerRealmReloadingClassLoader.ReloadClassPredicate() {
42             public boolean acceptReloadOf(String qualifiedName) {
43                 return "org.mockitousage.configuration.ClassCacheVersusClassReloadingTest$DoTheMocking".equals(qualifiedName)
44                     || "org.mockitousage.configuration.ClassToBeMocked".equals(qualifiedName);
45             }
46         };
47     }
48 
49     private void prepareMockitoAndDisableObjenesisCache() throws Exception {
50         testMethodClassLoaderRealm.doInRealm("org.mockitousage.configuration.ClassCacheVersusClassReloadingTest$PrepareMockito");
51     }
52 
53     public static class PrepareMockito implements Callable<Boolean> {
54         public Boolean call() throws Exception {
55             Class.forName("org.mockito.Mockito");
56             ConfigurationAccess.getConfig().overrideEnableClassCache(false);
57             return Boolean.TRUE;
58         }
59     }
60 
61     private static SimplePerRealmReloadingClassLoader.ReloadClassPredicate reloadMockito() {
62         return new SimplePerRealmReloadingClassLoader.ReloadClassPredicate() {
63             public boolean acceptReloadOf(String qualifiedName) {
64                 return (!qualifiedName.contains("net.bytebuddy") && qualifiedName.contains("org.mockito"));
65             }
66         };
67     }
68 
69 }
70