• 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 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