Afin de réaliser des tests unitaire sur du code qui peut être cloisonné (par exemple dans un contexte J2EE), je cherche à créer un espèce de "mini container" permettant d'isoler du code, ou de charger deux fois la même classe dans deux classloader différent (afin de reproduire un environnement similaire pour un test unitaire).
Voici un embryon de code :Le problème c'est que les deux classes chargé sont les mêmes alors qu'elles sont chargées par deux classloaders différents. La classe n'est même chargé qu'une seule fois puisque le message "loaded" n'est affiché qu'une fois.
Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 import java.net.URL; import java.net.URLClassLoader; public class Main { public static class MiniContainer { static { System.out.println("loaded"); } public void run() { } } public static void main(String[] args) throws Exception { URL[] urls = new URL[] { ClassLoader.getSystemResource("."), ClassLoader.getSystemResource(MiniContainer.class.getName() .replace('.', '/') + ".class") }; URLClassLoader cl1 = new URLClassLoader(urls); URLClassLoader cl2 = new URLClassLoader(urls); Class<?> class1 = cl1.loadClass(MiniContainer.class.getName()); Class<?> class2 = cl2.loadClass(MiniContainer.class.getName()); System.out.println(class1 == class2); MiniContainer c1 = (MiniContainer) class1.newInstance(); MiniContainer c2 = (MiniContainer) class2.newInstance(); } }
Dans ce cas, comment arriver à charger deux fois la même classe dans deux classloaders différents ?
Dernière remarque dans le code données en exemple, j'aimerai que les deux dernières ligne provoque une ClassCastException.
Merci d'avance.
Partager