2010-01-26 6 views
5

Ich verwende JUnit 3 und habe eine Situation, wo ich oft testen muss, ob ein Objekt korrekt erstellt wird. Meine Idee war, eine Klasse MyTestBase wie unten gezeigt zu schreiben und dann davon für die situationsspezifischen Komponententests zu erweitern.JUnit Basisklasse erweitern und Tests in dieser Klasse ausgeführt werden

In dem Beispiel, das ich angegeben habe, MyTests führt jedoch nicht die Tests in MyTestBase.

public class MyTestBase extends TestCase { 
    protected String foo; 
    public void testFooNotNull() { 
    assertNotNull(foo); 
    } 
    public void testFooValue() { 
    assertEquals("bar", foo); 
    } 
} 


public class MyTests extends MyTestBase { 
    public void setUp() { 
    this.foo = "bar"; 
    } 
    public void testSomethingElse() { 
    assertTrue(true); 
    } 
} 

Was mache ich falsch?

Update Entschuldigung. Dummer Fehler. Die Tests in meiner Basisklasse wurden nicht korrekt benannt.

+0

Warum nicht Junit 4 verwenden? – Bozho

+1

Da das System in Java geschrieben ist 1.4.2 –

+0

Ich habe gewählt, um die Frage zu schließen, weil es einfach falsch ist. Es stellt keine echte Frage. –

Antwort

4

Sie haben gesagt "MyTests führt die Tests nicht in MyTestBase aus". Ich habe es ausprobiert und alle Tests wurden auch in MyTestBase aufgerufen.

+0

hast du es mit JUnit 3 versucht? – Bozho

+0

Ja, ich habe es aus Eclipse mit JUnit 3 ausprobiert. Ich habe die MyTests-Klasse als JUnit-Test ausgeführt und alle Tests erfolgreich bestanden. –

+0

nett. dann ist die Frage irrelevant :) – Bozho

2

Nun, Sie könnten MyTestBase abstrakt machen, so dass es nicht versucht, Tests in der Basisklasse auszuführen. Eine bessere Lösung wäre, setUp in der Basisklasse zu haben und abstrakte Methoden aufzurufen (z. B. getFoo()), um die Variablen zu initialisieren, die später benötigt werden.

In der Tat, wenn Sie diese abstrakten Methoden haben Sie möglicherweise nicht einmal eine Setup-Phase überhaupt benötigen - Sie könnten die abstrakten Methoden, wo Sie den Wert benötigen, anstatt eine Instanzvariable verwenden . Offensichtlich hängt es von der genauen Situation ab, aber in vielen Fällen könnte dies viel sauberer sein.

0

Was Sie versuchen zu tun ist, nicht die am besten geeignete Weg, um Ihr Ziel zu erreichen:

Wenn Sie allgemeine Funktionen haben möchten, dass einige Prüfungen

  • definieren es in einer Utility-Klasse macht, in static Methoden
  • definieren es in der übergeordneten Klasse und nennen es von jeder Testmethode
0

ich weiß nicht, was genau Sie tun möchten, aber u Natürlich ist es keine sehr gute Idee zu viele gemeinsame Teile im Test, denn wenn der gemeinsame Teil versagt, werden Sie eine große Anzahl von Tests haben, die selbst dann nicht funktionieren, wenn Sie nur einen kleinen Fehler in Ihrer Software haben.

Ich empfehle Ihnen, eine Factory oder einen Builder zu verwenden, um das komplexe Objekt zu erstellen und dann die Factory (oder den Builder) zum korrekten Erstellen des Objekts zu testen.