Problem mit URLClassLoader und JUnit

xice

Mitglied
Hallo,

Ich lade eine externe Klasse (JUnitTest) mit URLClassLoader. Anschließend erfolgt die Ausführung des Tests. Dabei erhalte ich eine Fehlermeldung. Wird der ParentClassloader verwendet, verläuft der Test problemlos. Kann mir jemand sagen warum der Testfall nicht ausgeführt werden kann ?

Fehlermeldung
Code:
.F
Time: 0
There was 1 failure:
1) warning(junit.framework.TestSuite$1)junit.framework.AssertionFailedError: No tests found in classloader.JUnitTest
	at classloader.ClassLoader.main(ClassLoader.java:22)

FAILURES!!!
Tests run: 1,  Failures: 1,  Errors: 0

Java:
package classloader;

import junit.framework.TestCase;
import org.junit.*;

public final class JUnitTest extends TestCase {
    
    public JUnitTest() {
        //    
    }
    
    @Test
    public void Sample() {
        // Test
        System.out.println("testSample");        
        Assert.assertTrue(true);
    }    
}

Java:
package classloader;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.logging.Level;
import java.util.logging.Logger;
import junit.framework.TestCase;

public class ClassLoader {

    public static void main(String[] args) {                                
        
        File file = new File("/classloader"); 
        
        try {                                    
            
            URLClassLoader loader = new URLClassLoader(new URL[] {file.toURI().toURL()}, null);
            Class<? extends TestCase> clazz = (Class<? extends TestCase>) loader.loadClass("classloader.JUnitTest");                       
                        
            junit.textui.TestRunner.run(clazz);
            
            
        } catch (ClassNotFoundException | MalformedURLException ex) {
            Logger.getLogger(ClassLoader.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
 
Die Fehlermeldung könnte u.U. nicht direkt zielführend sein. Ich könnte mir vorstellen, dass Klassen nicht geladen werden können.

Zwei Fragen (die erste ist die wichtigere Frage):
1.) Was hast du eigentlich vor? Was soll das ganze?
2.) Warum hat dein URLClassLoader kein Parent?
 
Du brauchst eine eigene JUnit Laufzeitumgebung. Die Laufzeitumgebung benötigt im Klassenpfad die JRE, JUnit (mit allen Abhängigkeiten) und deine zu testende Applikation, die auch die Verbindung herstellt, mit allen Abhängigkeiten.

Die Laufzeitumgebung muss folgendes bieten: Konfiguration eines zusätzlichen Klassenpfades z.B. für einen URLClassLoader, der dann die Testressourcen laden kann.

Die Umgebung wird initial einmal gestartet (also Plugin in der IDE oder als Standaloneapplikation). Bei der Initialisierung wird die Verbindung hergestellt.
Ähnlich wie in der IDE solltest du jetzt folgendes konfigurieren können: zusätzlicher Klassenpfad (Tests und Testressourcen), die Testklasse(n) bzw. Methoden usw.
Danach kannst du selber JUnit mit den passenden werten aufrufen. JUnit führt die Tests aus und du kannst über JUnit Mittel die Ergebnisse auswerten. Das kannst du jetzt immer wieder tun, während deine Verbindung nicht beendet wird.

Der Classloader für die Tests muss aber als Parent den Classloader deines Tools referenzieren und (nach Standard) das laden einer Ressource erst an diesen delegieren.

Du kannst aber (natürlich) nur Testressourcen ändern.

Die Frage ist: ist es das wert?

Ich würde mal genau betrachten, was eigentlich getestet werden soll. In der Regel kann man einen Großteil der Tests über Mocks realisieren und benötigt keine echte Hardware. Es ist besser kleine Teile zu testen, als (nur?) die Businessobjekte und deren Schnittstellen. Die Meinung "wenn ich die Businessobjekte teste, teste ich ja den Rest implizit mit" ist so nicht richtig bzw. nicht günstig.
Für die Tests, die echte Hardware benötigen, stellt sich die Frage, wie gut man das überhaupt automatisieren könnnen muss bzw. ob JUnit überhaupt dort richtig und sinnvoll eingesetzt werden kann.
 

Neue Themen


Zurück
Oben