2016-04-28 2 views
0

Ich lerne, wie man Komponententests in GWT durchführt. Also erstelle ich eine Klasse, die die GWTTestCase-Klasse erweitert und Testmethoden darin schreibt.Muss ich jeder Komponententestmethode, die ich mit GWTTestCase erstelle, 'test' voranstellen?

Das Problem ist, dass, wenn ich das Wort "test" nicht nur eine Funktion in dieser Klasse (öffentlich oder privat) mit Ausnahme der geerbten "getModuleName" -Methode voranstellen, bekomme ich einen "Initialisierungsfehler".

Jetzt mache ich etwas falsch oder ist es eine Regel, dieses Präfix hinzuzufügen? Wenn es eigentlich eine Regel ist, was ist der Grund dafür?

public class hellotest extends GWTTestCase{ 
@Override 
public String getModuleName() { 
    // TODO Auto-generated method stub 
    return "hellopackage.Hello1"; 
} 

public void test() 
{ 
    assertTrue(true); 
} 

public void test2() 
{ 
    assertTrue(true); 
} 

public void notTest3()  //Produces initialization error 
{ 
    assertTrue(true); 
} 
} 

Der Stack-Trace des 'Fehler bei der Initialisierung': -

// Compiled from Filter.java (version 1.5 : 49.0, super bit) 
public abstract class org.junit.runner.manipulation.Filter { 

    // Field descriptor #14 Lorg/junit/runner/manipulation/Filter; 
    public static final org.junit.runner.manipulation.Filter ALL; 

    // Method descriptor #16()V 
    // Stack: 1, Locals: 1 
    public Filter(); 
    0 aload_0 [this] 
    1 invokespecial java.lang.Object() [1] 
    4 return 
     Line numbers: 
     [pc: 0, line: 17] 
     Local variable table: 
     [pc: 0, pc: 5] local: this index: 0 type: org.junit.runner.manipulation.Filter 

    // Method descriptor #22 (Lorg/junit/runner/Description;)Lorg/junit/runner/manipulation/Filter; 
    // Stack: 3, Locals: 1 
    public static org.junit.runner.manipulation.Filter matchMethodDescription(org.junit.runner.Description desiredDescription); 
    0 new org.junit.runner.manipulation.Filter$2 [2] 
    3 dup 
    4 aload_0 [desiredDescription] 
    5 invokespecial org.junit.runner.manipulation.Filter$2(org.junit.runner.Description) [3] 
    8 areturn 
     Line numbers: 
     [pc: 0, line: 48] 
     Local variable table: 
     [pc: 0, pc: 9] local: desiredDescription index: 0 type: org.junit.runner.Description 

    // Method descriptor #26 (Lorg/junit/runner/Description;)Z 
    public abstract boolean shouldRun(org.junit.runner.Description arg0); 

    // Method descriptor #28()Ljava/lang/String; 
    public abstract java.lang.String describe(); 

    // Method descriptor #30 (Ljava/lang/Object;)V 
    // Stack: 2, Locals: 3 
    public void apply(java.lang.Object child) throws org.junit.runner.manipulation.NoTestsRemainException; 
    0 aload_1 [child] 
    1 instanceof org.junit.runner.manipulation.Filterable [4] 
    4 ifne 8 
    7 return 
    8 aload_1 [child] 
    9 checkcast org.junit.runner.manipulation.Filterable [4] 
    12 astore_2 [filterable] 
    13 aload_2 [filterable] 
    14 aload_0 [this] 
    15 invokeinterface org.junit.runner.manipulation.Filterable.filter(org.junit.runner.manipulation.Filter) : void [5] [nargs: 2] 
    20 return 
     Line numbers: 
     [pc: 0, line: 93] 
     [pc: 7, line: 94] 
     [pc: 8, line: 96] 
     [pc: 13, line: 97] 
     [pc: 20, line: 98] 
     Local variable table: 
     [pc: 0, pc: 21] local: this index: 0 type: org.junit.runner.manipulation.Filter 
     [pc: 0, pc: 21] local: child index: 1 type: java.lang.Object 
     [pc: 13, pc: 21] local: filterable index: 2 type: org.junit.runner.manipulation.Filterable 

    // Method descriptor #38 (Lorg/junit/runner/manipulation/Filter;)Lorg/junit/runner/manipulation/Filter; 
    // Stack: 5, Locals: 3 
    public org.junit.runner.manipulation.Filter intersect(org.junit.runner.manipulation.Filter second); 
    0 aload_1 [second] 
    1 aload_0 [this] 
    2 if_acmpeq 12 
    5 aload_1 [second] 
    6 getstatic org.junit.runner.manipulation.Filter.ALL : org.junit.runner.manipulation.Filter [6] 
    9 if_acmpne 14 
    12 aload_0 [this] 
    13 areturn 
    14 aload_0 [this] 
    15 astore_2 [first] 
    16 new org.junit.runner.manipulation.Filter$3 [7] 
    19 dup 
    20 aload_0 [this] 
    21 aload_2 [first] 
    22 aload_1 [second] 
    23 invokespecial org.junit.runner.manipulation.Filter$3(org.junit.runner.manipulation.Filter, org.junit.runner.manipulation.Filter, org.junit.runner.manipulation.Filter) [8] 
    26 areturn 
     Line numbers: 
     [pc: 0, line: 105] 
     [pc: 12, line: 106] 
     [pc: 14, line: 108] 
     [pc: 16, line: 109] 
     Local variable table: 
     [pc: 0, pc: 27] local: this index: 0 type: org.junit.runner.manipulation.Filter 
     [pc: 0, pc: 27] local: second index: 1 type: org.junit.runner.manipulation.Filter 
     [pc: 16, pc: 27] local: first index: 2 type: org.junit.runner.manipulation.Filter 

    // Method descriptor #16()V 
    // Stack: 2, Locals: 0 
    static {}; 
    0 new org.junit.runner.manipulation.Filter$1 [9] 
    3 dup 
    4 invokespecial org.junit.runner.manipulation.Filter$1() [10] 
    7 putstatic org.junit.runner.manipulation.Filter.ALL : org.junit.runner.manipulation.Filter [6] 
    10 return 
     Line numbers: 
     [pc: 0, line: 21] 

    Inner classes: 
    [inner class info: #2 org/junit/runner/manipulation/Filter$2, outer class info: #0 
    inner name: #0, accessflags: 8 static], 
    [inner class info: #7 org/junit/runner/manipulation/Filter$3, outer class info: #0 
    inner name: #0, accessflags: 0 default], 
    [inner class info: #9 org/junit/runner/manipulation/Filter$1, outer class info: #0 
    inner name: #0, accessflags: 8 static] 
} 

Antwort

2

GWTTestCase erweitert JUnit 3 Testcase und in JUnit 3 sind Testmethoden in der Tat mit test beginnen soll.

Der Grund ist, dass JUnit so entworfen wurde: Es sucht nach öffentlichen Void-Methoden, die in den Testfällen mit test beginnen. Das war vor Java 5, als noch keine Anmerkungen existierten. Heutzutage verwendet JUnit 4 (und 5) Anmerkungen, um Testmethoden zu "markieren".

+0

Was wäre, wenn ich eine "Nicht-Testfall" -Methode in der Klasse haben wollte, die gwtTestCase erweitert. Das ist möglich? –

+0

Ja, natürlich. Nenne es nicht testXxx. –

+0

Wenn ich eine Funktion innerhalb dieser Klasse ohne Präfix "Test" erstellen, spielt es keine Rolle, ob es privat ist oder nicht, ich bekomme diesen Initialisierungsfehler. –

1

Neben der Frage "ist es technisch erforderlich", die bereits beantwortet wird; Sie könnten auch Konventionen berücksichtigen.

Die meisten Komponententests, die ich jemals gesehen habe, beginnen mit testWhatever().

Der Punkt ist: Benennung ist ein Kernelement des Schreibens sauberer, lesbarer, wartbarer Code. Das gilt für den Produktionscode; Aber hey, viele Leute denken, dass Ihr Testcode noch wichtiger ist als Produktionscode ... also ist das Schreiben von sauberem, lesbarem und wartbarem Testcode ein wichtiger Teil der Softwareentwicklung.

Mit anderen Worten: wahrscheinlich erwarten die meisten Leute, dass die Testmethoden mit "test" beginnen. Aber am Ende: Der Punkt wäre, dass die Namen sagen, was tatsächlich getestet wird; also test(), test1(), ... und so weiter wären wirklich wirklich schlechte Namen für Testmethoden.

(und Randnotiz: Wenn Sie daran interessiert sind, gute Tests zu schreiben, überprüfen Sie assertThat; und vergessen Sie über die Verwendung von anderen der Assert-Aufrufe).

+0

Guter Punkt. Eigentlich waren die Namen, die ich hier benutzte, nur um die Dinge einfacher zu machen. Ich benutze keine Namen wie test1. –

Verwandte Themen