2014-06-25 5 views
7

Gibt es einen Weg zur Testzeit, um eine Eigenschaft in das Java-Manifest zu injizieren (oder ein komplettes Manifest zu injizieren)?Java-Unit-Tests gesetzt Manifest-Eigenschaft

Wir lesen einen Wert aus dem Manifest (Versionsnummer), der zum Testzeitpunkt in null aufgelöst wird.

Bisher haben wir versucht, eine hartcodierte MANIFEST.MF-Datei in unseren Teststamm zu schreiben, aber es hat nicht funktioniert.

Dies ist der Code, den wir das Manifest lesen verwenden:

private Attributes getManifest() { 
    URLClassLoader cl = (URLClassLoader) getClass().getClassLoader(); 
    Manifest manifest; 
    try { 
     URL url = cl.findResource("META-INF/MANIFEST.MF"); 
     manifest = new Manifest(url.openStream()); 
    } catch (IOException e) { 
     throw Throwables.propagate(e); 
    } 
    return manifest.getMainAttributes(); 
} 

Als letztes werden wir die Funktionalität wickeln, die das Manifest und verspotten sie liest, aber diese sind Integrationstests und sollen sei Black Box (dh, wir meiden Spott).

Zusätzliche Informationen: Java 7, Ausführen von Junit-Tests in IntelliJ oder von Gradle.

+0

Also, wenn Sie einen Test durchführen, wo MANIFEST.MF befindet sich genau? –

+0

Warum möchten Sie Java-Manifest ändern, wenn Sie Tests (wahrscheinlich JUnit?) Ausführen, wenn der Test eine eigenständige Java-Anwendung ist und keine Anwendung in einem Container ausgeführt wird? – czpona

Antwort

2

Sie können die jcabi-manifests-Bibliothek ausprobieren: http://manifests.jcabi.com/. Es ist eine Abstraktion der Funktion der Java-Manifeste und ermöglicht es Ihnen, neue Daten anzuhängen oder mehrere Manifeste zur Laufzeit zu kombinieren.

Eine typische Verwendung wäre der Zugriff auf den Singleton Manifests.DEFAULT, der die MANIFEST.MF-Einträge Ihrer Anwendung zur Laufzeit enthält. Es ist möglich, dieses Objekt anhängen:

Manifests.DEFAULT.put("Test-Property", "Hello"); 

Manifests Javadoc: http://manifests.jcabi.com/apidocs-1.1/com/jcabi/manifests/Manifests.html

Nun, wenn Sie Manifests.DEFAULT wieder zugreifen, wird es den Eintrag "Test-Property" haben. Beachten Sie, dass Manifest.DEFAULT implementiert die Map Schnittstelle:

System.out.println(Manifests.DEFAULT.get("Test-Property")) // Prints "Hello"