2016-06-23 5 views
1

Ich versuche, JUnit für meine Funktionstests zu verwenden. Grundsätzlich mache ich das, um Zugriff auf die JUnit-Berichte zu haben. Leider habe ich ein Problem beim Versuch, JUnit von einer Hauptmethode aus zu starten.Junit startet keinen Testfall, wenn es eine anonyme Klasse ist

Grundsätzlich Ich entwickle eine funktionelle Prüfwerkzeug in dem der Benutzer einen Testdateinamen als Parameter von der Befehlszeile zur Verfügung stellen kann. Ich habe es vereinfacht ein wenig unter:

import org.junit.runner.JUnitCore; 

public class MainClass { 
    public static void main(String[] args) throws Exception { 
     TestCase testCase = new TestCase() { 
      @Override 
      public String getPath() { 
       return args[0]; 
      } 
     }; 

     JUnitCore junit = new JUnitCore(); 
     junit.run(testCase.getClass()); 
    } 
} 

Die Testcase-Klasse dann auf der mitgelieferten Parameter wirkt und liefert Ausgangs:

import org.junit.Assert; 
import org.junit.Test; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

public class TestCase { 
    private static final Logger LOGGER = LoggerFactory.getLogger(TestCase.class); 

    public String getPath() { 
     return "etc/Default.flow"; 
    } 

    @Test 
    public void testFunc() { 
     try { 
      LOGGER.info("Entered testFunc()"); 
      Launcher launcher = new Launcher(getPath()); 
      launcher.launch(); 
      launcher.awaitCompletion(); 

      Assert.assertTrue(launcher.getStatus()); 
      LOGGER.info("Success"); 
     } catch (AssertionError e) { 
      LOGGER.error("Assertion error", e); 
     } 
    } 

So von oben, sehen wir, dass der Launcher-Instanz gestartet werden mit einem anderen Dateinamen, je nachdem, was in der Befehlszeile eingegeben wurde.

Das Problem ist jedoch, dass Junit ist meine anonyme Klasse nicht aktiv. Grundsätzlich wird die Hauptmethode beendet, ohne dass eine der Assertions oder der Protokollierung stattfindet. Die Methode testCase testFunc() wird daher überhaupt nicht aufgerufen.

Allerdings, wenn ich die Testcase-Instanz ändern nicht anonym sein, funktioniert das Everthing wie erwartet und der Testfall ist erfolgreich:

import org.junit.runner.JUnitCore; 

public class MainClass { 
    public static void main(String[] args) throws Exception { 
     TestCase testCase = new TestCase(); 

     JUnitCore junit = new JUnitCore(); 
     junit.run(testCase.getClass()); 
    } 
} 

Warum nur die Test-Klasse JUnit starten würde, wenn es nicht anonym ist?

Antwort

2

Wenn Sie Hörer hinzufügen junit.addListener(new TextListener(System.out)); vor dem Test laufen Sie so etwas wie sehen:

There were 2 failures: 
1) initializationError(junit.MainClass$1) 
java.lang.Exception: The class junit.MainClass$1 is not public. 
... 
2) initializationError(junit.MainClass$1) 
java.lang.Exception: Test class should have exactly one public constructor 
    at org.junit.runners.BlockJUnit4ClassRunner.validateOnlyOneConstructor(BlockJUnit4ClassRunner.java:158) 
    at org.junit.runners.BlockJUnit4ClassRunner.validateConstructor(BlockJUnit4ClassRunner.java:147) 
    at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:127) 
    at org.junit.runners.ParentRunner.validate(ParentRunner.java:416) 
    at org.junit.runners.ParentRunner.<init>(ParentRunner.java:84) 
    at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:65) 

Es bedeutet, dass JUnit nicht in der Lage ist, die von anonymen Klassen repräsentiert Testfälle auszuführen.

+0

Vielen Dank, das macht Sinn. Ich habe mich für einen anderen Ansatz entschieden, indem ich Java-Eigenschaften von der Befehlszeile aus verwende. – mdewit

Verwandte Themen