2009-05-18 5 views
0

Ich schreibe ein Test-Framework, das eine GUI-Anwendung startet. Um diese GUI im Falle einer SWT-Anwendung testen zu können, muss ich deren Anzeige kennen. Im Allgemeinen wird diese Anzeige von einem anderen Classloader geladen, daher verwende ich die Methode findDisplay (Thread t) der Klasse swt Display by reflection, um diese Aufgabe zu erledigen. Mein Code sieht ungefähr so ​​aus:Anzeige einer RCP-App finden

Meiner Meinung nach sollte dies jedes Objekt vom Typ Display in der aktuellen Threadgruppe finden. Allerdings bekomme ich für das RTS-Beispiel des Texteditors keine, obwohl die GUI perfekt gestartet ist.

Irgendwelche Ideen was schief läuft oder wie kann ich das auf eine vernünftige Art und Weise debuggen?

+0

einen besonderen Grund, warum Sie einen anderen Test-Framework aufbauen, wenn es viele sind. dort draußen? Es sind kommerzielle Frameworks verfügbar, aber das SWTBot Eclipse-Projekt ist sehr gut und steht unter dem EPL zur Verfügung. – user85259

+0

Eigentlich ist das Framework, an dem ich gerade arbeite, etwas über abtot.swt, was vergleichbar mit SWTBot ist, denke ich. Aber das Ganze wird etwas "Integriertes" sein, das viele verschiedene Anwendungstypen handhaben kann, nicht nur SWT Apps. Ich beschränke mich also darauf, wie ich die zu testenden Anwendungen starte. – HerdplattenToni

Antwort

0

Ich habe herausgefunden, was das Hauptproblem war: Der ContextClassloader hatte nichts mit dem Klassenlader zu tun, der tatsächlich die Klassen geladen hat.

Um mein Problem zu lösen, kümmerte ich mich um den Klassenlader, der die swt-Anzeigeklasse sowohl in der Hierarchie des RCP-Programms als auch in der Hierarchie meines Frameworks lädt. Dies war mit dem Java-Erweiterungs-Classloader möglich. (Ich konnte den Application Classloader nicht verwenden, da meine RCP-Anwendung nicht als Parent funktioniert, ich habe noch nicht herausgefunden, warum). Es war nur eine Frage des Hinzufügens von swt.jar zu java.ext.dirs Eigentum.

0

Wenn Sie Eclipse RCP verwenden, dann vielleicht können Sie verwenden:

PlatformUI.getWorkbench() getDisplay()