2016-05-13 7 views
2

Ich habe einige Probleme mit ErrorCollectors in Java.JUnit + Java + ErrorCollector Problem

Ich habe einen Code, der zwei Werte vergleicht. Wenn die Werte übereinstimmen, ist ein Pass das Ergebnis. Wenn die Werte nicht übereinstimmen, schlägt ein Fehler vor. Klingt einfach. Also habe ich einen Basis-Testfall erstellt:

public class CB_Test { 


    @Rule 
    public ErrorCollector collector = new ErrorCollector(); 

    @Before 
    public void setUp() { 
     //steps = new WebDriverSteps(new FirefoxDriver()); 
     //steps = new WebDriverSteps(); 
    } 

    @Test 
    public void testme() { 
     String checkMe; 
     String value; 

     checkMe = "1234"; 
     value = "2234"; 

     System.out.println("value coming in : " + value); 
     System.out.println("value to check : " + checkMe); 
     collector.checkThat("Check values match", value, is(checkMe)); 

    } 
} 

Das verhält sich genau so, wie ich es wollte. Allerdings wollte ich dann diesen Code von woanders aufrufen lassen. Also habe ich meine „Haupt“ Datei wie folgt:

public class ABC_Test { 

    @Before 
    public void setUp() { 
     //steps = new WebDriverSteps(new FirefoxDriver()); 
     //steps = new WebDriverSteps(); 
    } 

    @Test 
    public void check() { 
     CheckVal dv = new CheckVal(); 

     try { 
      dv.checkTable("4234"); 
     } catch (AssertionError er) { 
      System.out.println("22"); 
     } catch (Exception e) { 
      System.out.println("23"); 
     } catch (Throwable t) { 
      System.out.println("24"); 
     } 

    } 

} 

und bewegt den Code den Scheck in tun:

public class CheckVal { 

    @Rule 
    public ErrorCollector collector = new ErrorCollector(); 

    public void checkTable(String value) { 

     String checkMe; 

     checkMe = "1234"; 

     System.out.println("value coming in : " + value); 
     System.out.println("value to check : " + checkMe); 
     collector.checkThat("Check values match", value, is(checkMe)); 

    } 

} 

Aber jetzt, wenn ich den Code ausführen, habe ich immer einen Pass erhalten, auch wenn ich einen Wert einführe, der dazu führt, dass ein Fehler erzeugt wird. Ich kann nicht sehen, was ich hier falsch mache. (Ich weiß, dass der Code unordentlich ist - das ist nur mein Versuch, Dinge auf ihre einfachste Art und Weise zu zerlegen, um zu versuchen, mein Problem zu sehen.)

Antwort

2

Die @Rule ist nicht in der Klasse im Test enthalten, die vom Test Runner ausgeführt wird und behandelt alle Anmerkungen. Ihr Code ist an dieser Stelle nur Code.

Sie müssen Ihren Code ändern, um die @Rule der Klasse unter Test zu bewegen, so die Anmerkung verarbeitet wird:

import org.junit.*; 
import org.junit.rules.ErrorCollector; 

public class ABC_Test { 
    @Rule 
    public ErrorCollector collector = new ErrorCollector(); 

    @Before 
    public void setUp() { 
     //steps = new WebDriverSteps(new FirefoxDriver()); 
     //steps = new WebDriverSteps(); 
    } 

    @Test 
    public void check() { 
     CheckVal dv = new CheckVal(collector); 

     try { 
      dv.checkTable("4234"); 
     } catch (AssertionError er) { 
     System.out.println("22"); 
     } catch (Exception e) { 
     System.out.println("23"); 
     } catch (Throwable t) { 
     System.out.println("24"); 
     } 
    } 

}

dann die resusable Klasse modifizieren, um die ErrorCollector und Prozess als normal zu akzeptieren :

import org.junit.*; 
import org.junit.rules.ErrorCollector; 
import org.hamcrest.CoreMatchers; 

public class CheckVal { 

public ErrorCollector collector = null; 

public CheckVal(ErrorCollector collector) { 
    this.collector = collector; 
} 

public void checkTable(String value) { 

    String checkMe; 

    checkMe = "1234"; 

    System.out.println("value coming in : " + value); 
    System.out.println("value to check : " + checkMe); 
    collector.checkThat("Check values match", value, CoreMatchers.is(checkMe)); 

} 

}

IntelliJ (oder Ihr Test-Runner) meldet dann den Fehler wie erwartet:

java.lang.AssertionError: Check values match 
Expected: is "1234" 
    but: was "4234" 
+0

Vielen Dank. Genau das war es - und danke auch für die Kommentare, die die Antwort erklären. Ich habe mit etwas ähnlichem gespielt – Joseph