2010-11-11 8 views
9

ich einige Probleme haben, wenn von Testcase, für JUnit 3. Szenario in einer Test-Klasse geerbt innere Klassen definieren, ist wie folgt:Fehler bei der Definition von inneren Klassen in einer Test-Klasse in JUnit

Foo.java

public class Foo { 
    public void method() { ... } 
} 

FooTest.java

public class FooTest extends TestCase { 
    public class Bar extends Foo { 
    public void method() { ... } 
    } 
    public void testMethod() { ... } 
} 

Nun, wenn ich das von eclipse-laufen, laufen die Tests in Ordnung, aber wenn ich versuche, von einem Ant-Task ausführen es fehlschlägt:

[junit] junit.framework.AssertionFailedError: Klasse Foo $ Bar keinen öffentlichen Konstruktor Testcase (String name) oder Testcase()

Bar ist kein Test-Klasse, es ist nur eine Unterklasse von Foo überschreiben eine Methode hat, dass Ich muss beim Testen nicht die echten Sachen machen.

Ich bin im Moment ziemlich verloren und ich weiß nicht, wie ich dieses Problem angehen soll. Ist die einzige Möglichkeit, die Unterklassen als Standalone zu erstellen?

+0

Wie lautet Ihre Ant-Konfiguration für Tests? –

Antwort

15

Dies liegt daran, dass Sie eine verschachtelte Klasse in Junit-Dateigruppe eingefügt haben. Fügen Sie Ihrer build.xml eine Eigenschaft "excludes" hinzu.

Zum Beispiel:

<target name="test" depends="test-compile"> 
    <junit> 
     <batchtest todir="${test.build.dir}" unless="testcase"> 
      <fileset dir="${test.build.classes}" 
       includes = "**/Test*.class" 
       excludes = "**/*$*.class"/> 
     </batchtest> 
    </junit> 
</target> 
+0

Dies ist eigentlich eine bessere Lösung als @Ignore, da die inneren Klassen in den Testergebnisdateien überhaupt nicht angezeigt werden, wenn sie in build.xml ausgeschlossen werden. Beide Lösungen funktionieren jedoch. – joscarsson

+0

Danke für diese Antwort, du hast mir geholfen zu verstehen, warum der Junit-Test der Ameise nur schnattert, nur weil ich eine private innere Klasse habe. Die Exclude-Anweisung hat den Trick gemacht. – JulianHarty

+0

Ich benutze zufällig eine '' mit einem verschachtelten '' 'mit einem' refid'. Sie können die '' 'nicht ändern, aber Sie können immer noch ein' 'Element innerhalb der' 'setzen, um die inneren Klassen zu entfernen, die' 'würde habe enthalten. –

5

Sie könnten versuchen, die Bar-Klasse als statisch definieren:

public class FooTest extends TestCase { 
    public static class Bar extends Foo { 
    public void method() { ... } 
    } 
    public void testMethod() { ... } 
} 

... aber die Tatsache, dass es in einer Umgebung arbeitet, aber nicht in einem anderen schlägt eine von zwei Dinge:

  1. Java Version
  2. Classpath
  3. [Edit: wie von Jim unten vorgeschlagen] Verschiedene Versionen von junit.jar
+1

+1 Ich würde noch eins hinzufügen: verschiedene Versionen von junit.jar. Es ist möglich, dass eine ältere Version von JUnit durch die verschachtelte nicht statische Klasse verwirrt wird. –

4

Ich fühle mich wie ein Nekroposter, aber die Sache ist, dass ich in ähnliches Problem mit Maven heute gerannt bin.

Übliche mvn test läuft gut, aber wenn ich will, laufen Tests von bestimmten Paket wie mvn test -Dtest=com.test.* - initializationError wird geworfen. Dies funktioniert sowohl für Junit 3 als auch für 4.

Ich fand den Grund für meine Maven-Fall, dies kann für die gleiche sein. Die Sache ist: standardmäßig Maven Test-Plugin (todsichere das ist) berücksichtigt nur bestimmte Teilmenge aller Klassen als "Test-Klassen", nämlich sie nach Namen suchen, wie * Test und so weiter (Sie können lesen Sie unter surefire's home page) .Wenn wir die Eigenschaft test definieren, überschreiben wir das Standardverhalten vollständig. Dies bedeutet, dass mit -Dtest=com.test.* todsichere nicht nur com.test.MyTestClass sondern auch com.test.MyTestClass.InnerClass und sogar com.test.MyTestClass$1 (d. H. Anonyme Klassen) abholen wird.

Also, um z.B. Wenn Sie Klassen aus einem Paket verwenden, sollten Sie so etwas wie -Dtest=com.test.*Test verwenden (wenn Sie Suffixe zur Identifizierung von Testklassen verwenden).

3

Sie können auch die verschachtelte Klasse @Ignore mit Anmerkungen versehen, wenn Sie wollen nicht alle inneren Klassen auszuschließen.

+1

Dies funktioniert nicht für anonyme innere Klassen. @Ignore Annotation ist hier ungültig. –

+0

Stimmt, aber die Frage ging nicht um anonyme innere Klassen. –