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(){
....}
};
 
F

Firephoenix

Gast
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ß
 

Rudolf

Bekanntes Mitglied
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.
 

tfa

Top Contributor
In JUnit4 kannst du doch alles über Annotations machen. Wieso also noch setUp-Methoden schreiben oder von Basisklassen ableiten?
 

Rudolf

Bekanntes Mitglied
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.
 

tfa

Top Contributor
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).
 
F

Firephoenix

Gast
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ß
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B JUnit4 Exception-Test Allgemeine Java-Themen 4
T JUnit4 - Probleme mit der Auswertung Allgemeine Java-Themen 6
M merkwürdiges Verhalten von JUnit4 Allgemeine Java-Themen 2
H In Testklasse Objekte erzeugen und in einer Schleife ausgebe Allgemeine Java-Themen 4
D Erste Schritte Liste erweitern Allgemeine Java-Themen 11
Bluedaishi Zeile um zeichen erweitern Allgemeine Java-Themen 9
J Application mit PLugin erweitern Allgemeine Java-Themen 2
A Java Kenntnisse erweitern Allgemeine Java-Themen 5
E Java Programm mit Clients erweitern - Möglichkeiten? Allgemeine Java-Themen 2
B Hilfe!! spiel um Funktion des Selektierens erweitern (mit ASCII-Tabelle) Allgemeine Java-Themen 3
J build.xml erweitern Allgemeine Java-Themen 2
B Polibios Array erweitern Allgemeine Java-Themen 1
M XML-Datei "erweitern" mit Java Allgemeine Java-Themen 2
K Java Standardbib/reservierte Wörter erweitern Allgemeine Java-Themen 1
H Reg Exp Ausdruck erweitern Allgemeine Java-Themen 2
T Klassen Mehoden einer Klasse erweitern Allgemeine Java-Themen 5
M HashMaps: Wert erweitern Allgemeine Java-Themen 3
J Input/Output Jar-Datei zur Laufzeit erweitern Allgemeine Java-Themen 13
nrg URL erweitern Allgemeine Java-Themen 2
T Klassen Fabrik (Factory) zur Laufzeit erweitern Allgemeine Java-Themen 5
GUI-Programmer JDK erweitern Allgemeine Java-Themen 42
S Ant erweitern..? Allgemeine Java-Themen 4
I Pattern zum Erweitern existierender Objekte Allgemeine Java-Themen 4
C Kontextmenü erweitern und mit Java Anwendung verknüfen. Allgemeine Java-Themen 3
W Erweitern einer Klasse mit Generics Allgemeine Java-Themen 8
M eigene Klasse durch Composition mit java.io.File erweitern Allgemeine Java-Themen 3
D Enums subclassen / erweitern? Allgemeine Java-Themen 2
J Können Programme sich selbst erweitern? Allgemeine Java-Themen 6
dunhillone Mittels Annotations Methoden "erweitern"? Allgemeine Java-Themen 11
S Objekt in Datei erweitern Allgemeine Java-Themen 16
DamienX Erweitern von Runnable Allgemeine Java-Themen 3
P Funktion vorhanden - wie auf Transitivität erweitern? Allgemeine Java-Themen 6
N Classpath mit ClassLoader künstlich erweitern Allgemeine Java-Themen 2
M ArrayList erweitern - generics Allgemeine Java-Themen 4
P JComponenten (Button, JSlider, usw) erweitern Allgemeine Java-Themen 12
G Vector erweitern Allgemeine Java-Themen 4
G Tabellenzeilen erweitern Allgemeine Java-Themen 9
B desktop auf monitor erweitern Allgemeine Java-Themen 22
N Graphische Oberfläche dynamisch erweitern möglich? Allgemeine Java-Themen 4
D Programm um Klassen erweitern ohne neukompilieren? Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben