2010-12-07 21 views
7

Ich habe einen Test, der einen großen Blob der erwarteten XML mit dem tatsächlichen XML vergleicht. Wenn sich die XML-Datei wesentlich unterscheidet, wird die tatsächliche XML-Datei zur Analyse auf die Festplatte geschrieben und der Test schlägt fehl.Ist es möglich für E JUnit-Test zu sagen, ob es in Eclipse (statt Ant) läuft

Ich würde es vorziehen, assertEquals zu verwenden, damit ich die XML in Eclipse einfacher vergleichen kann - aber das könnte zu sehr großen JUnit- und CruiseControl-Protokollen führen.

Gibt es eine Möglichkeit, ein JUnit-Testverhalten zu ändern, je nachdem, ob es durch Eclipse oder über Ant läuft.

+3

Ich verstehe nicht, warum Das assertEquals erleichtert den Vergleich in Eclipse. Sicherlich wird jedes Diff-Tool tun? –

Antwort

9

Hier sind 2 Lösungen.

Verwenden Systemeigenschaften

boolean isEclipse() { 
    return System.getProperty("java.class.path").contains("eclipse"); 
} 

Verwendung stacktrace

boolean isEclipse() { 
    Throwable t = new Throwable(); 
    StackTraceElement[] trace = t.getStackTrace(); 
    return trace[trace.length - 1].getClassName().startsWith("org.eclipse"); 
} 
+0

Der Ansatz "Systemeigenschaften verwenden" funktionierte für mich, danke! –

+0

@AlexR Brilliant, nie gedacht, eine Ausnahme instanziieren, um den Kontext meines aktuellen Anrufs zu bestimmen. Dies ist reif für Missbrauch, aber es scheint, als ob es Fälle gibt, in denen es perfekt ist. Danke dafür. – ArtB

0

Normalerweise sind die Systemanforderungen in verschiedenen Umgebungen unterschiedlich. Versuchen Sie, nach einer Systemeigenschaft zu suchen, die nur von Eclipse oder Ant festgelegt wird.

BTW: Die Ausgabe in Eclipse ist die gleiche, nur die Konsole für Eclipse macht die Ausgabe in einer lesbareren Form.

Persönlich würde ich mir keine Sorgen über die Größe der Protokolle machen. Im Allgemeinen müssen Sie sie nicht sehr lange halten und der Speicherplatz ist billig.

+0

Dies wäre ein interessanter Kommentar für die Frage, aber es ist definitiv keine nützliche Antwort. – dolmen

2

Ja - Sie können testen, ob bestimmte osgi Eigenschaften festgelegt sind (System.getProperty("osgi.instance.area") zum Beispiel). Sie werden leer sein, wenn Junit durch die Ant außerhalb von Eclipse gestartet wird.

+0

Es ist auch leer von innen Eclipse Juno. :( – dolmen

+0

funktioniert möglicherweise für org.eclipse.osgi .. es funktioniert für Thunfisch – Cshah

0

Mit Java 1.6+, sieht es aus wie das Ergebnis System.console() einen Unterschied macht für Eclipse oder von einem Terminal zwischen Laufen:

boolean isRealTerminal() 
{ 
    // Java 1.6+ 
    return System.console() != null; 
} 
1

Vielleicht ist der "java.class.path" Ansatz kann schwach sein, wenn Sie einige Eclipse-Glas in die umfassen Pfad.

Eine alternative approch könnte "sun.java.command" statt zu testen:

Auf meinem Rechner (openjdk-8):

sun.java.command org.eclipse.jdt.internal.junit.runner.RemoteTestRunner ... 

Ein möglicher Test:

boolean isEclipse() { 
    return System.getProperty("sun.java.command") 
     .startsWith("org.eclipse.jdt.internal.junit.runner.RemoteTestRunner"); 
} 
Verwandte Themen