Junit

läuft nicht in der Console

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Junit
Habe folgendes Problem will JUnit in Console ausführen mit

$javac -cp .:/usr/share/java/junit4.jar DLListTest.java     

dann kommt der Fehler

Fehler: Hauptklasse DLListTest.java konnte nicht gefunden oder geladen werden

da die Main nicht in DLListTest.java ist sondern in DLList.java

wenn ich Junit in Eclipse einbinde dann läuft es ohne probleme? Weiß aber nicht warum er da nicht meckert.

Kann mir da jemand weiterhelfen warum es in der Console nicht läuft?


Willst du jetzt den Kram kompilieren oder ausführen?

Probiers mal so: javac -cp .:/usr/share/java/junit4.jar *.java zum kompilieren der ganzen .java-Dateien und dann java -ea -cp .:/usr/share/java/junit4.jar org.junit.runner.JUnitCore DLListTest zum ausführen des Tests. Sollte natürlich alles im selben Verzeichnis sein.


kommt Fehlermeldung

invalid flag -ea

ohne -ea kommt Fehlermeldung

error: Class names, 'org.junit.runner.JUnitCore,DLListTest', are only accepted if annotation processing is explicitly requested

führe es von dem Verzeichnis aus in dem sich die DLListTest.java und DLList.java befindet


Du wirst dich wohl vertippt haben. Entweder das, oder du hast eine sehr seltsame JVM. Was ich oben geschrieben habe funktioniert auf jeden Fall auf meinem Rechner und auf dem CIP, beides Loonix.


Ich glaube du brauchst entweder eine Extra Klasse:

public class Dings{ 
    public static void main(String[] args){
        Result result = JUnitCore.runClasses(DLList.class);
        ....
    }

und dann halt

javac -cp .:/usr/share/java/junit4.jar DLListTest.java Dings.java DLList.java
java -cp .:/usr/share/java/junit4.jar DLList.....

oder sowas:

junit.runner.JUnitCore.runClasses(DLListTest.class, DLList.class);

Aber nagelt mich jetzt darauf nicht fest. Ich glaube diese Aufgabe WILL man einfach mit Ecclipse machen.


Problem scheinbar gelöst in der DLListTest Main methode mit

public static void main(String[] args){
		org.junit.runner.JUnitCore.main(new Object() { }.getClass().getEnclosingClass().getSimpleName());
	
	}

so stands in Testklasse in aktueller AuD übung. Mit dem vermerkt das man garnicht erst vewrsuchen soll das zu verstehen. :smiley:
jetzt gehts.

dann noch kompilieren mit:

javac -cp .:/usr/share/java/junit4.jar *.java

und ausführen mit:

$java -cp .:/usr/share/java/junit4.jar DLListTest

Ergebnis:

JUnit version 4.11
...........
Time: 0,011

OK (11 tests)

Copy’n Paste Code best Code


deiner geht ja nicht, irgendwie muss ich ja an meinen Code kommen. :smiley:


Auch wenn es jetzt scheinbar bei dir geht mit Klassenrumgefrickel, diese Fehlermeldungen sehen danach aus, als ob du [m]javac[/m] statt [m]java[/m] verwendet hast. Siehe zum Beispiel hier. Die Option [m]-ea[/m] ist darüber hinaus standardisiert und muss von jeder JVM unterstützt werden, die sich JVM nennen will. Wenn du es wirklich so machst, wie von kissen geschrieben, funktioniert es auch (auf unixoiden Betriebssystemen mit einer junit4.jar im Verzeichnis /usr/share/java).


FACEPALM jo das -ea hab ich bei javac rangehaengt… loest aber problem nicht das es fehlermeldung ausgibt das es keine Main methode findet. Ich frage mich halt was da Eclipse macht, wovon man nichts weis, und eben keine main methode verlangt in der DLListTest.java …


Die [m]DLListTest[/m] braucht keine [m]main()[/m]-Methode, da diese schon in [m]org.junit.runner.JUnitCore[/m] vorhanden ist. Deswegen sieht der [m]java[/m]-Aufruf ja auch folgendermaßen aus:

java -ea -cp .:/usr/share/java/junit4.jar org.junit.runner.JUnitCore DLListTest
     (1)        (2)                            (3)                      (4)

(1) Assertions aktivieren. Nicht unbedingt notwendig.
(2) Classpath anpassen, so dass die JUnit-Klassen gefunden werden können
(3) Die eigentlich auszuführende Klasse ist [m]org.junit.runner.JUnitCore[/m]. In dieser Klasse findet sich die gesamte Logik, um die Testausführung anzustoßen.
(4) Die zu testende Klasse. Eigentlich ist das nur ein Argument für [m]org.junit.runner.JUnitCore[/m], welches dann in ihrer [m]main()[/m]-Methode in [m]args[/m] steht.

Wenn du also [m]org.junit.runner.JUnitCore[/m] aus dem Aufruf weglässt, dann brauchst du natürlich eine [m]main()[/m]-Methode. Wenn du es aber so hinschreibst, wie oben und von kissen beschrieben, dann ist eine eigene [m]main()[/m]-Methode nicht notwendig.

Ich hoffe, das hilft weiter.


Ja sehr gut, so gehts. Ja hilft sehr. wusste nicht das ueber die Runner ne Main implementiert ist. DAs erklaert auch warum Eclipse nicht rumzickt. Man will ja auch verstehen was man da eingibt und warum es funktioniert.


Hallo,
ich hab mal ne Frage zur 1.4b):
Wie kann ich denn die kompilierten Klassen BrokenSort1-3 in mein Eclipse Projekt einbinden, sodass ich in SortTest.java (Zeile 15-18) Objekte der jeweiligen Klassen erstellen kann?


Edit: Das Aufgabenblatt hat recht, ist nur ungenau:

  • Ordner in Eclipse erstellen
  • Dateien in den Ordner kopieren
  • Projekt → Java Build Path → Libraries → Add Class Folder → Neu erstellten Ordner auswaehlen

Oder:
Rechte Maustaste auf das Projekt → Build Path → Add External Archives → Zip auswaehlen

:cool:


Ahh das war ja einfach :smiley: Vielen Dank für die Hilfe, wer weiß wie lange ich da noch rumgedoktort hätte :-p


Würd sagen, spätestens bis 28.04.2015 um 9:59…


Hallo,
ich habe auch noch ein paar Fragen bzgl. der 1.4b.
Wie sollen wir auf die 4 verschiedenen Klassen zugreifen? über die zurückgegebene Liste von data()? Oder sollen wir wenn wir mit einer der 4 klassen arbeiten wollen einfach ein neues objekt der jeweiligen klasse erzeugen? Ich hab auch noch nicht so ganz verstanden warum beim Arrayzugriff nach der Sortierung jede zahl im Array 4 mal nacheinander dort steht. Also z.B. a[0]=1111 anstelle nur 1?


Der vorgegebene SortTest-Rumpf ist bereits ein parametrisierter JUnit-Test. Jede mit der [m]@Test[/m]-Annotation versehene Methode wird in diesem Fall vier Mal ausgeführt. Im Instanzfeld [m]s[/m] findet sich dabei jeweils eine der vier Implementierungen, während im Feld [m]id[/m] deren Name steht. Dass dies geschieht, darum kümmert sich die [m]data()[/m]-Methode. Für die Abgabe braucht man also nur eine entsprechende Anzahl an Testmethoden zu schreiben, die das Feld [m]s[/m] benutzen.

Die zweite Frage verstehe ich leider nicht. Das hat aber wahrscheinlich etwas mit deinem Code zu tun, was du im Zweifelsfall in einer Rechnerübung ansprechen willst. :wink:


wie soll man den auf das “Feld s” zugreifen? also bei mir akzeptiert Eclipse das nicht wenn ich auf s zugreifen will