Stellen Sie sich vor, Sie haben eine Anwendung, für die Sie Unit-Tests und Funktionstests durchführen möchten (das ist nicht schwer vorstellbar). Sie könnten eine abstrakte Klasse haben, nennen wir sie AbstractTestClass, von der alle Ihre Unit-Tests ausgehen.
AbstractTestClass würde etwa so aussehen (unter Verwendung von JUnit 4) :
class AbstractTestClass {
boolean setupDone = false;
@Before
public void before() {
if(!setupDone) {
// insert data in db
setupDone = true;
}
}
}
Ich habe mit folgenden Problemen zu kämpfen. Ich habe eine andere abstrakte Klasse, die die Web-Schnittstellen testen:
class AbstractWebTestClass extends WebTestCase {
boolean setupDone = false;
@Before
public void before() {
if(!setupDone) {
// here, make a call to AbstractTestClass.before()
// init the interfaces
setupDone = true;
}
// do some more thing
}
}
Es ist so ziemlich die gleiche Klasse, außer dass sie die Klasse WebTestCase . Dieser Entwurf könnte mir die Möglichkeit geben, beim Unit-Test dieselben Daten zu haben wie beim Testen der Schnittstelle.
Normalerweise sollten Sie bei solchen Problemen die Komposition der Vererbung vorziehen oder ein Strategiemuster verwenden.
Leider gefällt mir die Idee nicht ganz, in diesem speziellen Szenario Komposition gegenüber Vererbung zu bevorzugen, und ich sehe nicht, wie ich ein Strategiemuster verwenden könnte, wahrscheinlich gibt es einen Designfehler, und ich kann die Lösung nicht ganz erkennen.
Wie könnte ich diese Architektur gestalten, um mein Ziel zu erreichen?