Angenommen, ich habe eine ältere JUnit-Testsuite, die folgende Tests enthält:
%Vor% Nehmen Sie nun an, dass die Awesome Mocking-Bibliothek auf der Awesome BCEL-Bytecode-Generierungsbibliothek basiert, die die Klasse org.useful.XMLClass
enthält und diese Bibliothek die Version 1 von XMLClass hat.
Nehmen Sie nun an, dass die Amazing Xml-Operation auf der Amazing Xml Library basiert, die die Klasse org.useful.XMLClass
enthält und diese Bibliothek die Version 2 der XML-Klasse hat.
Nehmen Sie außerdem an, dass Version 2 der Klasse nicht rückwärtskompatibel zur Version 1 ist - also welche Version im Klassenpfad eine höhere Priorität hat - sie bricht die Abhängigkeiten der anderen Version.
Nehmen Sie außerdem an, dass es 400 Tests gibt, die auf einer genialen Mocking-Bibliothek basieren - daher ist das Neuschreiben keine wünschenswerte Option.
Nehmen Sie auch an, dass einige kritische Geschäftsfunktionen mit einer erstaunlichen XML-Bibliothek erstellt wurden - und es ist sehr zu bevorzugen, dies nicht neu zu schreiben.
Wie lösen Sie diese Klassenpfad-Hölle-Situation - abgesehen davon, dass Sie die Ameisen-Tests (vorausgesetzt Sie laufen sie mit Ant) zweimal mit zwei unterschiedlich manuell geordneten Klassenwegen und manuell bestimmten Test-Untermengen durchführen? (Ich bin offen für eine Idee mit benutzerdefinierten Classloadern - aber das scheint etwa das gleiche Maß an Wartbarkeit wie der doppelte benutzerdefinierte Klassenpfad mit ant-Lösung)
Ich glaube, dass eine ziemlich transparente Lösung mit einem Java-Agenten und einem benutzerdefinierten Klassenlader möglich ist. Die Idee ist folgende:
org.useful.XMLClass
zum Beispiel auf intercepted.org.useful.XMLClass
. intercepted.org.useful.XMLClass
ist. Wenn dies der Fall ist, laden Sie die Version von XMLClass
, die von der Mocking-Bibliothek verwendet wird. Alle anderen Anfragen können standardmäßig bearbeitet werden. Verwenden Sie den benutzerdefinierten Klassenlader und hängen Sie den Java-Agenten an, wenn Sie die Tests ausführen, und alles sollte ordnungsgemäß ausgeführt werden, als ob kein Abhängigkeitskonflikt vorhanden wäre.
Ich denke, Steven's Antwort ist großartig - der Vollständigkeit halber und weil diese Frage so viele Stimmen bekam - wollte ich alle Alternativen teilen, von denen wir dachten (einschließlich der schlechten)
org.useful.XMLClass
verwendet (dies stellte sich als größer heraus als unser aktuelles Projekt) Tags und Links dependencies java classpath junit