2016-10-28 3 views
1

zu verwenden. Der Code für MyTest wurde aktualisiert, um die Antwort zu reflektieren, die durch mehrere Implementierungen von assertEquals() in JUnit Ökosystem verfügbar ist .JUnit scheint nicht meine überschriebenen TestWatcher failed/succeeded Methoden

Ich habe eine ähnliche Frage in C gesehen, aber keine Antwort/Antworten. Ich habe mich bei der Implementierung entweder links gedreht oder überblicke etwas Einfaches. Also ...

Ich würde erwarten, die "IT-Fehler" und "IT PASSED" auf der Konsole zu sehen, aber keine Freude. Nur die Ausgabe "testFailure()" und "testSuccess()".

Testrunner impl

import junit.runner.Version; // added to support version check 
import org.junit.runner.JUnitCore; 

public class TestRunner { 
    public static void main(String[] args) { 
     System.out.println(Version.id()); // added to check JUnit version 
     JUnitCore.runClasses(MyTest.class); 
    } 
} 

Test-Umsetz

// NO LONGER NEDED (v3 -v- v4) import junit.framework.TestCase; 
import org.junit.Rule; 
import org.junit.Test; 
import ort.junit.Assert.assertEquals; // version that invokes TestWatcher 

// public class MyTest extends TestCase { // JUnit v3.X semantics 
public class MyTest {      // JUnit v4.X semantics 

    @Rule 
    public MyTestWatcher myTestWatcher = new MyTestWatcher(); 

    @Test 
    public void testFailure() { 
     System.out.println("testFailure()"); 
     assertEquals("failure", true, false); 
    } 

    @Test 
    public void testSuccess() { 
     System.out.println("testSuccess()"); 
     assertEquals("failure", true, true); 
    } 
} 

TestWatcher impl

import org.junit.rules.TestWatcher; 
import org.junit.runner.Description; 

public class MyTestWatcher extends TestWatcher { 

    public MyTestWatcher() {} 

    @Override 
    protected void failed(Throwable e, Description description) { 
     System.out.println("IT FAILED"); 
    } 

    @Override 
    protected void succeeded(Description description) { 
     System.out.println("IT PASSED"); 
    } 
} 
+0

Sie verwenden nicht 'TestWatcher' nach dem Javadoc: http://junit.org/junit4/javadoc/4.12/org/junit/rules/TestWatcher.html – Tunaki

+0

Ich kopiere einfach und einfügen und alles funktioniert gut Hier. Versuchen Sie alte JAR-Dateien zu säubern und alles neu zu erstellen. – Paulo

+0

"Sie verwenden TestWatcher nicht ordnungsgemäß gemäß dem Javadoc ..." scheint 180 aus "Ich kopiere einfach und einfügen und alles funktioniert gut ...". Aber zumindest weiß ich jetzt, dass der Code die erwarteten Ergebnisse erzeugen sollte, und kann sich auf meine Umgebung vice der Code selbst konzentrieren. – SoCal

Antwort

1

Die Ursache ist die Abwärtskompatibilität zwischen JUnit V3.X und JUnit V4.x. Es ist nett, aber es hat eine interessante Überladung auf die Behauptungsaussagen gebracht.

In meinem ursprünglichen Code war die aufgerufene Methode org.junit.framework.TestCase.assertEquals(). Diese Version von assertEquals() scheint jedoch TestWatcher.failed() und TestWatcher.succeeded() nicht aufzurufen. Während also der Code "erfolgreich ausgeführt wurde", gab er die gewünschte Protokollierungsinformation (d. H. "IT FAILED"/"IT PASSED") nicht aus.

Die Lösung bestand darin, sicherzustellen, dass die assert-Anweisungen die richtige Implementierung aufrufen (d. H. Die in org.junit.Assert). Der einfachste Weg, dies zu tun, war, den Test so zu modifizieren, dass er der v4.X-Semantik entspricht (d. H. TestCase nicht erweitert), und dann die korrekte import-Anweisung hinzufügt.

Mit diesen Änderungen an MyTest funktioniert jetzt alles wie erwartet. Ich habe meinen ursprünglichen Beitrag aktualisiert, um zu zeigen, wo Änderungen vorgenommen wurden.

Verwandte Themen