2013-01-10 11 views
5

Ich arbeite an einem Projekt, wo ich vor dem Ausführen jedes JUnit-Tests eine Aktion durchführen muss. Dieses Problem wurde mithilfe von RunListener gelöst, das dem JUnit-Core hinzugefügt werden konnte. Das Projekt Montag wird mit Maven getan, so hat ich diese Zeilen in meiner pom Datei:Verwenden von JUnit RunListener in IntelliJ IDEA

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-surefire-plugin</artifactId> 
      <version>2.12</version> 
      <configuration> 
       <properties> 
        <property> 
         <name>listener</name> 
         <value>cc.redberry.core.GlobalRunListener</value> 
        </property> 
       </properties> 
      </configuration> 
     </plugin> 

Also, alles funktioniert mit:

mvn clean test 

Aber wenn Tests gestartet werden mit IntelliJ (seinem internen Test runner) die Aktionen, die in unserem RunListener codiert sind, werden nicht ausgeführt, daher ist es unmöglich, Tests mit der IntelliJ Infrastruktur durchzuführen.

Wie ich sehe, IntelliJ analysiert diese Konfiguration nicht aus der Pom-Datei. Gibt es eine Möglichkeit, IntelliJ explizit mitzuteilen, RunListener zum JUnit-Core hinzuzufügen? Können einige VM-Optionen in der Konfiguration verwendet werden?

Es ist viel bequemer, eine schöne IntelliJ-Testumgebung zu verwenden, anstatt die maven-Ausgabe zu lesen.

P.S. Die Aktion, die ich ausführen muss, ist im Grunde eine Zurücksetzung der statischen Umgebung (einige statische Felder in meinen Klassen).

Antwort

3

Ich habe keine Möglichkeit gefunden, einen RunListener in Intellij anzugeben, aber eine andere Lösung wäre, Ihren eigenen Runner zu schreiben und @RunWith() bei Ihren Tests zu kommentieren.

public class MyRunner extends BlockJUnit4ClassRunner { 
    public MyRunner(Class<?> klass) throws InitializationError { 
     super(klass); 
    } 

    @Override 
    protected void runChild(final FrameworkMethod method, RunNotifier notifier) { 
     // run your code here. example: 
     Runner.value = true;    

     super.runChild(method, notifier); 
    } 
} 

Probe statische Variable:

public class Runner { 
    public static boolean value = false; 
} 

Dann die Tests wie folgt ausführen:

@RunWith(MyRunner.class) 
public class MyRunnerTest { 
    @Test 
    public void testRunChild() { 
     Assert.assertTrue(Runner.value); 
    } 
} 

Dies ermöglicht Ihnen, Ihre statische Initialisierung ohne RunListener zu tun.

+0

Vielen Dank für eine andere Lösung! Ich denke jetzt nur daran, ein globales Elternelement für alle meine Testklassen hinzuzufügen, wobei die '@ Before'-Methode angegeben ist. Also, in jedem Fall muss ich alle meine Testdateien bearbeiten. :(Ich werde ein Ticket in IntelliJ Bug Tracker erstellen, um diese Funktion hinzuzufügen. – dbolotin