2009-05-18 4 views
0

J'écris un framework de test qui démarre une application graphique. Pour pouvoir tester cette interface graphique dans le cas d'une application SWT, je dois savoir que c'est l'affichage. En général, cet affichage est chargé par un autre classloader, donc j'utilise la méthode findDisplay (Thread t) de la classe swt Display par réflexion pour accomplir cette tâche. Mon code ressemble à ceci:Recherche de l'affichage d'une application RCP

Thread[] threads = new Thread[10]; 
Thread.enumerate(threads); 
Object foundObject = null; 
for (Thread t : Arrays.asList(threads)){ 
    foundObject = null; 
    Class<?> clazz = t.getContextClassLoader().loadClass("org.eclipse.swt.widgets.Display"); 
    final Method method = clazz.getMethod("findDisplay", Thread.class); 
    foundObject = method.invoke(null, new Object[] {t}); 
    if (foundObject != null) { 
     System.out.println("yeah, found it!"); 
     break; 
    } 
} 

À mon avis, ce devrait trouver tous les objets de type d'affichage dans le groupe de thread courant. Cependant, je n'en ai pas pour l'exemple de RCP texteditor bien que l'interface graphique démarre parfaitement.

Des idées sur ce qui ne va pas ou comment je peux déboguer cela d'une manière raisonnable?

+0

Une raison particulière pour laquelle vous construisez un autre framework de test quand il y a beaucoup. là-bas? Des frameworks commerciaux sont disponibles, mais le projet SWTBot Eclipse est très bon et est disponible sous EPL. – user85259

+0

En fait, le framework sur lequel je travaille est quelque chose en plus de abbot.swt, ce qui est comparable à SWTBot je pense. Mais le tout sera quelque chose "intégré" qui peut gérer de nombreux types d'applications différentes, pas seulement les applications SWT. Donc, je suis un peu limité sur la façon dont je démarre les applications sous test. – HerdplattenToni

Répondre

0

J'ai trouvé quel était le problème principal: Le ContextClassloader n'avait rien à voir avec le chargeur de classes qui chargeait réellement les classes.

Pour résoudre mon problème, j'ai pris soin de charger le classloader qui charge la classe d'affichage swt à la fois dans la hiérarchie du programme RCP et dans la hiérarchie de mon framework. Cela a été possible en utilisant le chargeur de classes d'extension java. (Je ne pouvais pas utiliser le classloader de l'application puisque mon application RCP ne fonctionne pas avec lui en tant que parent, je n'ai pas encore compris pourquoi) Il s'agissait alors juste d'ajouter le fichier swt.jar au fichier java.ext.dirs propriété.

0

Si vous utilisez Eclipse RCP alors peut-être que vous pouvez utiliser:

PlatformUI.getWorkbench() getDisplay()

Questions connexes