2016-03-22 17 views
1

Ich versuche mit JUnit in die Tests zu kommen und ich habe Mühe zu verstehen, was ich falsch mache. Ich habe etwas ziemlich einfaches gemacht:JUnit: Test Annotation und erwartete Ausnahmen

Eine Klasse, die in der Lage sein sollte, etwas zu erstellen. Bisher teste ich nur, ob das Objekt null ist oder nicht.

Die Tester-Klasse erstellt ein neues TestedClass-Objekt und versucht, etwas mit null zu erstellen. Es erwartet eine IllegalArgumentException.

import org.junit.Test; 
public class Tester { 
    @Test(expected = IllegalArgumentException.class) 
    public void createWithNullShouldThrowException() { 
     TestedClass t = new TestedClass(); 
     t.create(null); 
    } 
} 

Nur die Hauptklasse.

public class Main { 
    public static void main(String[] args) { 
     Tester test = new Tester(); 
     test.createWithNullShouldThrowException(); 
     System.out.println("passed all tests!"); 
    } 
} 

So wie ich es verstehe, sollte es richtig beenden, wenn ein Illegal während des gesamten Prüfvorgangs geworfen gibt. Was der Fall ist, wie mein Programm endet mit:

Exception in thread "main" java.lang.IllegalArgumentException 
    at TestedClass.create(TestedClass.java:4) 
    at Tester.createWithNullShouldThrowException(Tester.java:6) 
    at Main.main(Main.java:7) 

Was nicht geschehen sollte, da es durch die createWithNullShouldThrowException() -Methode in der Klasse Tester erwischt werden sollte, oder bin ich das nicht richtig zu verstehen? Ich weiß, dass ich das wahrscheinlich mit einem try catch block machen könnte, aber ich möchte nur wissen, was in diesem Fall falsch ist. Wenn es irgendeine Hilfe ist, verwende ich IntelliJ IDEA 16.1. Jede Hilfe wäre willkommen.

+0

Sie müssen keine Instanz von Tester in der Hauptmethode erstellen. In Eclipse können Sie die Testklasse ausführen, indem Sie mit der rechten Maustaste auf die Datei klicken und dann Ausführen als-> JUnit-Test ausführen. Ich bin mir ziemlich sicher, dass Intellij etwas Ähnliches ist. –

+0

Yup. Führe es nicht durch 'main()', führe es durch jUnit. Es funktioniert perfekt, wenn es korrekt ausgeführt wird. –

+0

Nebenbei: Verwenden Sie nicht '@ Test (erwartet = IllegalArgumentException.class)'. Verwenden Sie stattdessen ExpectedException. Siehe http://stackoverflow.com/questions/156503/how-do-you-assert-that-a-certain-exception-is-thrown-in-junit-4-tests?rq=1, aber ignoriere die akzeptierte Antwort . Dies gibt Ihnen eine bessere Kontrolle über das Erkennen der Ausnahme. –

Antwort

4

Sie benötigen die Hauptklasse/Methode nicht. Unit Tests sollten über den Unit Test Runner durchgeführt werden. In Intellij Idea können Sie mit der rechten Maustaste auf eine Klasse mit @Test-Anmerkungen klicken und auf den Menüpunkt 'Ausführen' klicken oder bei jedem Test auf das kleine Laufsymbol klicken oder im Stammverzeichnis des Tests-Ordners auf 'Alle Tests ausführen' klicken.

In einem Maven-Projekt können Sie mvn test eingeben, wenn der Test an der richtigen Stelle ist. Andere Build-Tools enthalten eine Möglichkeit, die Testsuite auszuführen. Wie auch andere IDEs.

Wenn Sie eine main Methode haben möchten, sollten Sie das Junit-Test-Framework starten, indem Sie die correct test runner aufrufen. Es ist jedoch sehr unwahrscheinlich, dass Sie das wirklich tun wollen.

+0

Danke, das hat mich den ganzen Morgen verrückt gemacht. – skulpt