JUnit4-Testklasse erweitern ohne zu vererben

Rudolf

Bekanntes Mitglied
Hallo,

ich habe einen 4Junit-Testklasse mit einer Testmethode und einer weiteren Helfermethode. Die Helfermethode will ich überschreiben und mit anderen Code füllen. Ich könnte die ganze Klasse erben lassen, aber ich frage mich, ob es nicht ohne ginge.

Z.B. indem man eine Instanz der Klasse erstellt und dort eine Methode überschreibt. Aber wie führt man sie danach aus?

Java:
final Testklasse test=new Testklasse{
@Override
public void test(){
....}
};
 
Wofür ist denn die Helfermethode?
Wenn es in Richtung Strategie geht könnte man vermutlich eine schickere Lösung über parametriesiertes Testen machen (irgendwo fliegt dazu noch Code bei mir rum, muss mal suchen).

Gruß
 
Es ging mir darum statt von einer Testklasse, die JUnit4 Methoden benutzt, zu erben, eine normale Klasse zu nutzen, diese zu erweitern, durch überschreibung von Methoden, und "laufen" zu lassen. Aber dann müsste man alle Methoden wie test() setup() usw selber ausführen und das macht das Erben einer Testklasse attraktiver.

Wer aber noch eine attraktive Lösung hat, soll sie gerne posten. Klassen durch Spezialisierungen zu erweitern sollte man nur wenn es nicht anders geht, weil damit eine Anwendung unflexibler gemacht wird. Spezialisierungen sollte man so viel wie nötig und so wenig wie möglich nutzen.
 
In JUnit4 kannst du doch alles über Annotations machen. Wieso also noch setUp-Methoden schreiben oder von Basisklassen ableiten?
 
Ganz einfach,

  • weil die Testfallmethoden so identisch sind, dass sich das Kopieren nicht lohnt
  • Doppelter Code stinkt

Nimm z.b. eine Factory. Die eine Factory erstellt ein Model mit lesbaren Werten, die andere mit weniger lesbaren Werten, um Validation durchzuführen. Aber die Testabfragen sind identisch und nur die Methode mit dem return new Factory() soll überschrieben werden.
 
Ich würde Vererbung nicht dafür missbrauchen, nur um Code wiederzuverwerten. Ich kenn jetzt die Situation nicht, aber vielleicht kannst du den eigentlichen Testcode in eine parametrisierte Methode auslagen. Dann kannst du z.B. die zu erzeugende Factory per Argument übergeben.
Ausgefeiltere Testframeworks wie Scalatest machen das einem noch einfacher (hierfür braucht es aber einiges an Einarbeitungszeit).
 
Wenn ich das richtig verstehe willst du also nur das Testobjekt, bzw die Factory die die Tesobjekte / Fixtures liefert austauschen, der Testcode soll identisch bleiben.

Ich hab dir dazu mal ein Beispiel gemacht wie so etwas mit Parametrisierten Tests aussehen könnte, allerdings hat die Version (noch) unter Eclipse den Nachteil, das die Testbenennungen sehr unschön aussehen, genaueres dazu unter: java - Changing names of parameterized tests - Stack Overflow

Java:
@RunWith(Parameterized.class)
public class MyTests {

	private MyFactory factory;
	private MyFixture fixture;

	public MyTests(MyFactory factory, MyFixture fixture) {
		this.factory = factory;
		this.fixture = fixture;

	}

	@Parameters
	public static Collection<Object[]> parameters() {
		return Arrays.asList(new Object[][] {
				{ new FactoryA(), new FixtureA() },
				{ new FactoryB(), new FixtureB() },
				{ new FactoryA(), new FixtureB() },
				{ new FactoryB(), new FixtureA() } });
	}
	
	@Test
	public void factoryMatchesFixture(){
		System.out.println(factory.testString()+"-"+fixture.fixtureString());
		assertEquals(factory.testString(), fixture.fixtureString());
	}
}

Java:
public interface MyFactory {

	
	public String testString();
}

Java:
public interface MyFixture {

	public String fixtureString();
}

Java:
public class FactoryA implements MyFactory{

	@Override
	public String testString() {
		return "A";
	}

}

Java:
public class FactoryB implements MyFactory {

	@Override
	public String testString() {
		return "B";
	}

}

Java:
public class FixtureA implements MyFixture {


	@Override
	public String fixtureString() {
		return "A";
	}

}

Java:
public class FixtureB implements MyFixture{

	@Override
	public String fixtureString() {
		return "B";
	}

}

lässt man die Testklasse laufen erhält man folgende Ausgabe:
Code:
A-A
B-B
A-B
B-A

Gruß
 

Neue Themen


Zurück
Oben